1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include <iostream> #include <cstring> #include <queue> using namespace std; const int N = 20010; const int INF = 0x3f3f3f3f; int h[N], e[N], ne[N], w[N], idx; typedef pair<int, int>PII; void add(int a, int b, int c) { e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++; } void dijkstra(int u,int dist[N],int st[N]) { memset(dist, INF, sizeof dist); for(int i=1;i<=3;i++) cout<<dist[i]<<" "; dist[u] = 0; priority_queue<PII, vector<PII>, greater<PII>>pq; pq.push({ 0,u }); while (!pq.empty()) { auto t = pq.top(); pq.pop(); int ver = t.second; if (st[ver]) continue;
st[ver] = 1; for (int i = h[ver]; i != -1; i = ne[i]) { int j = e[i]; if (dist[j] > dist[ver] + w[i]) { dist[j] = dist[ver] + w[i]; pq.push({ dist[j],j }); } } }
cout << endl; } int main() { int dist1[N], dist2[N], st1[N], st2[N]; memset(dist1, INF, sizeof dist1); memset(dist2, INF, sizeof dist2); int n, s, t; cin >> n >> s >> t; int m; cin >> 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); add(b, a, c); } dijkstra(s, dist1, st1); dijkstra(t, dist2, st2);
int k; cin >> k; int mint = INF; int flag = 0; for (int i = 0; i < k; i++) { int x, y, z; cin >> x >> y >> z; if (dist1[x] + dist2[y] + z < mint) { mint = dist1[x] + dist2[y] + z; printf("dist1:%d dist2:%d z:%d\n",dist1[x],dist2[y],z); flag = 1; } } for (int i = 1; i <= n; i++) { if (dist1[i] + dist2[i] < mint) { mint = dist1[i] + dist2[i] ; printf("dist1:%d dist2:%d\n",dist1[i],dist2[i]); flag = 0; } } cout << mint; }
|