HDU1874-畅通工程续(Dijkstra最短路)
来源:互联网 发布:nginx 直播服务器搭建 编辑:程序博客网 时间:2024/06/14 22:21
畅通工程续
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 53333 Accepted Submission(s): 19918
Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0< N<200,0< M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B< N,A!=B,0< X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T< N),分别代表起点和终点。
Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
Sample Input
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2
Sample Output
2
-1
Author
linle
Source
2008浙大研究生复试热身赛(2)——全真模拟
题目大意:求最短路
解题思路: Dijkstra
邻接矩阵:
/*单源最短路径,Dijkstra算法,邻接矩阵形式,复杂度为O(n^2)求出源beg到所有点的最短路径,传入图的顶点数和邻接矩阵cost[][]返回各点的最短路径lowcost[],路径pre[],fa[i]记录beg到i路径上的父结点,pre[beg]=-1可以更改路径权类型,但权值必须为非负*/#include<iostream>#include<cstdio>#include<cstring>#include<fstream>using namespace std;const int MAXN=1010;#define typec intconst typec INF=0x3f3f3f3f;bool vis[MAXN];int fa[MAXN];typec cost[MAXN][MAXN];typec lowcost[MAXN];int n,e;void Dijkstra(int beg){ for(int i=0;i<n;i++) { lowcost[i]=INF; vis[i]=false; fa[i]=-1; } lowcost[beg]=0; for(int j=0;j<n;j++) { int k=-1; int Min=INF; for(int i=0;i<n;i++) { if(!vis[i]&&lowcost[i]<Min) { Min=lowcost[i]; k=i; } } if(k==-1) break; vis[k]=true; for(int i=0;i<n;i++) { if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]) { lowcost[i]=lowcost[k]+cost[k][i]; fa[i]=k; } } }}int main(){ ios::sync_with_stdio(false); while(cin>>n>>e) { memset(cost,INF,sizeof(cost)); int tmp; for(int i=0;i<e;i++) { int x,y; cin>>x>>y; cin>>tmp; if(cost[x][y]>tmp) { cost[x][y]=tmp; cost[y][x]=tmp; } } int s,t; cin>>s>>t; Dijkstra(s); if(lowcost[t]==INF) cout<<"-1"<<endl; else cout<<lowcost[t]<<endl; /*for(int i=0;i<=n-1;i++) cout<<lowcost[i]<<" "; cout<<endl; for(int i=0;i<=n-1;i++) cout<<fa[i]<<" "; cout<<endl;*/ } return 0;}
邻接表:
/*使用优先队列Dijkstra算法复杂度O(ElogE)注意对vector<Edge> E[MAXN]进行初始化后加边*/#include<iostream>#include<cstdio>#include<vector>#include<queue>#include<fstream>#include<string.h>using namespace std;const int INF=0x3f3f3f3f;const int MAXN=10000;int n,e;int fa[MAXN];bool vis[MAXN];int dist[MAXN];int ans[MAXN];struct qnode{ int v,c; qnode(int _v=0,int _c=0):v(_v),c(_c){} bool operator <(const qnode &r)const { return c>r.c; }};struct Edge{ int v,cost; Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}};vector<Edge> E[MAXN];void Dijkstra(int start)//点的编号从1开始{ memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++) dist[i]=INF; priority_queue<qnode> que; while(!que.empty()) que.pop(); dist[start]=0; que.push(qnode(start,0)); qnode tmp; while(!que.empty()) { tmp=que.top(); que.pop(); int u=tmp.v; if(vis[u]) continue; vis[u]=true; int sz=E[u].size(); for(int i=0;i<sz;i++) { int v=E[tmp.v][i].v; int cost=E[u][i].cost; if(!vis[v]&&dist[v]>dist[u]+cost) { dist[v]=dist[u]+cost; que.push(qnode(v,dist[v])); fa[v]=u; } } }}void addedge(int u,int v,int w){ E[u].push_back(Edge(v,w));}int main(){ //freopen("in.txt","r",stdin); ios::sync_with_stdio(false); while(cin>>n>>e) { for(int i=0;i<=n;i++) { if(!E[i].empty()) E[i].clear(); } int u,v,w; for(int i=1;i<=e;i++) { cin>>u>>v>>w; addedge(u+1,v+1,w); addedge(v+1,u+1,w); } int s,t; cin>>s>>t; Dijkstra(s+1); if(dist[t+1]==INF) cout<<"-1"<<endl; else cout<<dist[t+1]<<endl; /*if(dist[t+1]!=INF) { int tot=1; for(int i=t+1;i!=s+1;) { ans[tot++]=i; i=fa[i]; } ans[tot]=s+1; for(int i=tot;i>=1;i--) cout<<ans[i]-1<<" "; cout<<endl; }*/// for(int i=1;i<=n;i++)// cout<<dist[i]<<" ";// cout<<endl; } return 0;}
- HDU1874-畅通工程续-最短路(dijkstra)
- HDU1874畅通工程续 (Dijkstra算法求最短路)
- HDU1874-畅通工程续(Dijkstra最短路)
- hdu1874 畅通工程续 (最短路)
- hdu1874 畅通工程续(最短路)
- HDU1874:畅通工程续(最短路)
- HDU1874 畅通工程续 解题报告--最短路dijkstra算法
- hdu1874畅通工程续【最短路dijkstra&&SPFA&&floyd】
- hdu1874畅通工程续——最短路(Dijkstra算法)(spfa算法)
- hdu1874 畅通工程续(Dijkstra算法,单源最短路)
- hdu1874-畅通工程续(最短路)
- HDU1874--畅通工程续--最短路
- 畅通工程续(hdu1874,floyd最短路)
- hdu1874 畅通工程续 最短路
- hdu1874 畅通工程续 最短路
- hdu1874 畅通工程续(单元最短路)
- HDU1874-畅通工程续-最短路
- hdu1874畅通工程续 --hdu2544最短路(Floyd)
- CentOS 7 隐藏任务栏和顶栏
- LVS+keepalived实现双机热备和负载均衡
- Android Studio Error:Execution failed for task ':library:compileReleaseJava'
- 杭电acm2071 Max Num
- Java CRC16校验
- HDU1874-畅通工程续(Dijkstra最短路)
- 工厂模式
- Java 字节字符转换流
- 28. Implement strStr() Add to List
- HUD 2955
- 友盟多渠道打包
- slice与split的区别
- 随笔0525
- 冒泡排序法