ACDream-C - Transformers' Mission(Dijastra最短路径)
dijstra求最短路径:经典应用题目:
题意:给你一个带权值无向图,权值是A点到B点的时间,然后告诉你起点,一个人可以去炸掉一个结点或多个节点,也可以派多个人,最终这些人在终点集合,问最后一个到达终点的人到达的时间;
分析:最短路中的最大值;数据不大,暴力枚举;
1 #include <bits/stdc++.h> 2 #define mem(a, val) memset((a), (val), sizeof a) 3 #define all(a) (a).begin(), (a).end() 4 #define pb push_back 5 #define mp make_pair 6 #define fir first 7 #define sec second 8 #define repu(i,a,b) for(int i=a;i<b;i++) 9 using namespace std; 10 typedef pair<int, int> pii; 11 typedef long long LL; 12 typedef unsigned long long LLU; 13 const int maxn=1100; 14 const int INF=0x3f3f3f3f; 15 struct Edge 16 { 17 int u, v, d; 18 Edge(int u, int v, int d):u(u), v(v), d(d) {} 19 }; 20 struct qnode 21 { 22 int u, d; 23 qnode(int u, int d):u(u), d(d) {} 24 bool operator < (const qnode a)const 25 { 26 return d>a.d; 27 } 28 }; 29 30 struct Dijkstra 31 { 32 int n; 33 vector<int> G[maxn]; 34 vector<Edge> edge; 35 int d[maxn]; 36 bool vis[maxn]; 37 void init(int n) 38 { 39 this->n=n; 40 for(int i=0; i<=n; i++) 41 { 42 G[i].clear(); 43 vis[i]=0; 44 d[i]=INF; 45 } 46 edge.clear(); 47 } 48 void AddEdge(int u, int v, int d) 49 { 50 G[u].push_back(edge.size()); 51 edge.push_back(Edge(u, v, d)); 52 } 53 void dijkstra(int s) 54 { 55 priority_queue<qnode> q; 56 d[s]=0; 57 q.push(qnode(s, 0)); 58 while(!q.empty()) 59 { 60 qnode x=q.top(); 61 q.pop(); 62 63 if(vis[x.u])continue ; 64 vis[x.u]=true; 65 for(int i=0; i<G[x.u].size(); i++) 66 { 67 Edge& e=edge[G[x.u][i]]; 68 if(d[e.v]>d[x.u]+e.d) 69 { 70 d[e.v]=d[x.u]+e.d; 71 q.push(qnode(e.v, d[e.v])); 72 } 73 } 74 } 75 } 76 } dij1, dij2; 77 int main() 78 { 79 int T, n, m, kase=0; 80 scanf("%d", &T); 81 while(T--) 82 { 83 scanf("%d%d", &n, &m); 84 dij1.init(n);///初始化不可缺 85 dij2.init(n); 86 repu(i,0,m) 87 { 88 int u, v, w; 89 scanf("%d%d%d", &u, &v, &w); 90 dij1.AddEdge(u, v, w);///2条边,4个队列 91 dij1.AddEdge(v, u, w); 92 dij2.AddEdge(u, v, w); 93 dij2.AddEdge(v, u, w); 94 } 95 int st,ed; 96 scanf("%d%d",&st,&ed); 97 dij1.dijkstra(st);///计算从st到每个顶点的最短距离 98 dij2.dijkstra(ed);///计算从ed到每个顶点的最短距离 99 int ans = 0; 100 repu(i,0,n) 101 { 102 ans = max(ans,dij1.d[i]+dij2.d[i]); 103 ///从st到i的距离+从ed到i的最短距离,即从st到ed的最短距离 104 ///循环保证经过每一个点 105 } 106 printf("%d\n",ans); 107 } 108 return 0; 109 }
人生就像心电图,想要一帆风顺,除非game-over