constint N = 1e6 + 10; typedef pair<int, int> PII;
int n, m; int h[N], e[N], ne[N], w[N], idx; priority_queue<PII, vector<PII>, greater<PII>> heap;//小根堆 int d[N];//节点到起点的最短距离 bool st[N];
voidadd(int a, int b, int c) { e[idx] = b; ne[idx] = h[a]; w[idx] = c; h[a] = idx ++; } intDijkstra() { memset(d, 0x3f, sizeof d); d[1] = 0; heap.push({0, 1});//距离 + 节点 while (heap.size()) { auto t = heap.top();//堆顶取出 heap.pop(); int ver = t.second;//节点编号 int distance = t.first;//记录距离 if (st[ver]) continue;//如果说当前节点已经确定,就跳过以下语句 st[ver] = true;//要进行以下语句就给当前节点打上标记 for (int i = h[ver]; i != -1; i = ne[i]) { int j = e[i];//节点编号 if (d[j] > distance + w[i]) { d[j] = distance + w[i];//更新节点距离 heap.push({d[j], j}); } } } if (d[n] == 0x3f3f3f3f) return-1; return d[n]; } intmain() { cin >> n >> m; memset(h, -1, sizeof h); for (int i = 0; i < m; i ++ ) { int a, b, c; cin >> a >> b >> c; add(a, b, c); } int ans = Dijkstra(); cout << ans << endl; }
structEdge { int a, b, w; }edges[M]; int n, m, k; int d[N], backup[N];
intbellman_ford() { memset(d, 0x3f, sizeof d); d[1] = 0; for (int i = 0; i < k; i ++ ) { memcpy(backup, d, sizeof d); for (int j = 0; j < m; j ++ ) { int a = edges[j].a, b = edges[j].b, w = edges[j].w; d[b] = min(d[b], backup[a] + w); } } return d[n]; } intmain() { cin >> n >> m >> k; for (int i = 0; i < m; i ++ ) { int a, b, w; cin >> a >> b >> w; edges[i] = {a, b, w}; } int ans = bellman_ford(); if (ans >= 0x3f3f3f3f / 2) puts("impossible"); elseprintf("%d\n",ans); }
int n, m; int h[N], e[N], ne[N], w[N], idx;//邻接表 int d[N]; bool st[N];//用于判断队列中是否有重复的点
voidadd(int a, int b, int c) { e[idx] = b; ne[idx] = h[a]; w[idx] = c; h[a] = idx ++; } intspfa() { memset(d, 0x3f, sizeof d); d[1] = 0; st[1] = true;//在队列之中 queue<int> q; q.push(1); while (q.size()) { int t = q.front(); q.pop(); st[t] = false; for (int i = h[t]; i != -1; i = ne[i]) { int j = e[i]; if (d[j] > d[t] + w[i]) { d[j] = d[t] + w[i]; if (!st[j]) { q.push(j); st[j] = true; } } } } return d[n]; } intmain() { memset(h, -1, sizeof h); cin >> n >> m; for (int i = 0; i < m; i ++ ) { int a, b, c; cin >> a >> b >> c; add(a, b, c); } int ans = spfa(); if (ans >= 0x3f3f3f3f) printf("impossible\n"); elseprintf("%d\n", ans); }
constint N = 210, INF = 1e9; int m, n, Q; int d[N][N];
voidFloyd() { for (int k = 1; k <= n; k ++ ) { for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= n; j ++ ) { d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } } } } intmain() { scanf("%d%d%d",&n,&m,&Q); for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= n; j ++ ) { if (i == j) d[i][j] = 0; else d[i][j] = INF; } } for (int i = 0; i < m; i ++ ) { int a, b, c; scanf("%d%d%d",&a,&b,&c); d[a][b] = min(d[a][b], c); } Floyd(); while (Q --) { int a, b; scanf("%d%d",&a,&b); if (d[a][b] >= INF / 2) printf("impossible\n"); elseprintf("%d\n",d[a][b]); } return0; }
constint N = 510, INF = 1e9; int n, m, s, d; //城市个数,m个操作,起点,终点 int g[N][N];//存储边权 int cnt[N];//最短路径的条数 int save[N];//各个城市的救援队数量 int sum_save[N];//到达该城市的所有救援队 int e[N];//到达目标城市前经过的城市编号 int path[N], q;//路径 bool st[N];//判断城市是否经过
voiddijkstra()//朴素dijkstra算法 { cnt[s] = 1, st[s] = true;//标记起点经过 for (int i = 0; i < n; i ++ ) { int min = INF; int t = -1;
} } intmain() { cin >> n >> m >> s >> d; for (int i = 0; i < n; i ++ ) scanf("%d",&save[i]), sum_save[i] = save[i], cnt[i] = 1;//读入各个城市的救援队数量并且对sum_save进行初始化
//初始化 for (int i = 0; i < n; i ++ ) { for (int j = 0; j < n; j ++ ) { if (j == i) g[i][j] = 0; else g[i][j] = INF; } } for (int i = 0; i < m; i ++ )//m个操作 { int a, b, w; scanf("%d%d%d",&a,&b,&w);//无向图 g[a][b] = w; g[b][a] = w; } dijkstra(); printf("%d %d\n",cnt[d], sum_save[d] + save[s]); for (int i = e[d]; i != 0; i = e[i]) path[q ++] = i; printf("%d ", s); for (int i = q - 1; i >= 0; i -- ) printf("%d ",path[i]); printf("%d\n", d); }