标签:choose the best rout hdoj2680 最短路 图论
5 8 5 1 2 2 1 5 3 1 3 4 2 4 7 2 5 6 2 3 5 3 5 1 4 5 1 2 2 3 4 3 4 1 2 3 1 3 4 2 3 2 1 1
1 -1题意:就拿第二个例子来说吧!4(节点数1-4) 3(3条路) 4(源点位置)(起点)1 2 31 3 42 3 2;(3条路)1;(一个终点)1;(终点位置)求起点到终点的最短路!!思路:可以用floyd 直接全部遍历,求出即可!!,但太耗时,可能超时,我这里用dijkstra写的:代码:#include<cstdio> #include<cstring> #include<algorithm> #define MAX 0x3f3f3f3f using namespace std; int map[1010][1010],d[1010],n,m,s,t; void dijkstra(int x) { int i,j,min,mark,used[1010]; for(i=1;i<=n;i++) { used[i]=0;//全部标记为未访问 d[i]=map[x][i];//全部指向 源点 } d[x]=0; //源点到自己为零 used[x]=1;//源点标记为访问过 for(i=2;i<=n;i++) { min=MAX; mark=-1; for(j=1;j<=n;j++)//寻找距离最近的点 { if(!used[j]&&d[j]<min) { min=d[j]; mark=j;//记录下标 } } if(mark==-1) break; used[mark]=1;//将下标的节点标记为已访问 for(j=1;j<=n;j++) { if(!used[j]&&d[j]>d[mark]+map[mark][j])//更新路径 d[j]=d[mark]+map[mark][j]; } } } int main() { int a,b,c,i,j; while(scanf("%d%d%d",&n,&m,&s)!=EOF) { memset(map,MAX,sizeof(map)); for(i=0;i<m;i++)//取图 { scanf("%d%d%d",&a,&b,&c); if(map[b][a]>c)//防止重边 map[b][a]=c; } dijkstra(s); int start; int mi=MAX; scanf("%d",&t); for(i=0;i<t;i++) { scanf("%d",&start); mi=mi<d[start]?mi:d[start];//求出最短距离 } if(mi==MAX)//无法找到最短路 printf("-1\n"); else printf("%d\n",mi); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdoj 2680 Choose the best route
标签:choose the best rout hdoj2680 最短路 图论
原文地址:http://blog.csdn.net/zhangxiaoxiang123/article/details/48026317