ACDream-C

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
",ans);
107     }
108     return 0;
109 }
View Code
原文地址:https://www.cnblogs.com/ACMERY/p/4382509.html