首页 > 代码库 > hdu 2680 (Dijkstra)
hdu 2680 (Dijkstra)
快放暑假了,训练又要开始了。先从熟悉的图论开始做吧。
题意:一张有向图中有若干起点一个终点,让你算最短路,方法很简单只需人为加一个起点指向所有起点让后距离为0即可。
代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <set> 5 #include <iostream> 6 #include <queue> 7 #include <map> 8 #include <math.h> 9 #include <string>10 #define MP(a, b) make_pair(a, b)11 #define PB(a) push_back(a)12 using namespace std;13 14 typedef pair<int, int> pii;15 const int LEN = 1010;16 const int INF = 0x3f3f3f3f;17 vector<pii> Map[LEN];18 int n, m, dis[LEN];19 20 void Dijkstra(int vex){21 int vis[LEN] = {0};22 priority_queue<pii, vector<pii>, greater<pii> > q;23 for(int i=0; i<=n; i++) dis[i] = INF;24 dis[vex] = 0;25 q.push(MP(dis[vex], vex));26 while(!q.empty()){27 pii nvex = q.top(); q.pop();28 int nv = nvex.second;29 if(vis[nv]) continue;30 vis[nv] = 1;31 for(int i=0; i<Map[nv].size(); i++){32 int x = Map[nv][i].first, y = Map[nv][i].second;33 if(dis[x] > dis[nv] + y){34 dis[x] = dis[nv] + y;35 q.push(MP(dis[x], x));36 } 37 }38 }39 }40 41 int main()42 {43 // freopen("in.txt", "r", stdin);44 45 int a, b, c, tn, s, e;46 while(scanf("%d%d%d", &n, &m, &e)!=EOF){47 for(int i=0; i<LEN; i++) Map[i].clear();48 for(int i=0; i<m; i++){49 scanf("%d%d%d", &a, &b, &c);50 Map[a].PB(MP(b, c));51 }52 scanf("%d", &tn);53 for(int i=0; i<tn; i++){54 scanf("%d", &s);55 Map[0].PB(MP(s, 0));56 }57 Dijkstra(0);58 if(dis[e] != INF) printf("%d\n", dis[e]);59 else puts("-1");60 }61 return 0;62 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。