zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    创建FLASK,同步docker
    FLASK Buleprint
    restful api
    Angular JS
    线程日志
    将项目部署到linux下的docker容器中
    安装和卸载docker
    学习目录总编
    Ansible
    装饰器
  • 原文地址:https://www.cnblogs.com/ACMERY/p/4382509.html
Copyright © 2011-2022 走看看