标签:find the safest road hdoj 1596 最短路 图论
3 1 0.5 0.5 0.5 1 0.4 0.5 0.4 1 3 1 2 2 3 1 3
0.500 0.400 0.500根据题意,直接建图,floyd 遍历任意两点的最短距离!再根据题上要求输出即可!floyd 代码:#include<stdio.h> #define ac 1005 double map[ac][ac]; int n,m; int main() { int i,j,k,a,b; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++)//直接建图 for(j=1;j<=n;j++) { scanf("%lf",&map[i][j]); } for(k=1;k<=n;k++)//floyd 找到任意两点的最短路 for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(map[i][j]<map[i][k]*map[k][j]) map[i][j]=map[i][k]*map[k][j]; } scanf("%d",&m); while(m--) { scanf("%d%d",&a,&b); if(map[a][b]==0)//如果安全数为零,则输出 What a pity! printf("What a pity!\n"); else printf("%.3lf\n",map[a][b]); } } return 0; }dijkstra代码:每次进行函数调用,把题目要求的点当做起点和终点进行求最短路!!#include<stdio.h> #include<string.h> #define ac 1005 #define inf 100000000 double map[ac][ac],dist[ac]; int n,m,v[ac]; double dijkstra(int a,int b) { int i,j; int next,start=a,end=b; double maxdist; memset(v,0,sizeof(v)); for(i=1;i<=n;i++) { dist[i]=map[start][i];//找到所有点到源点集合的距离 } v[start]=1; for(i=2;i<=n;i++) { maxdist=-1 ; for(j=1;j<=n;j++)//找到距离最近的点 { if(!v[j]&&maxdist<dist[j]) { maxdist=dist[j]; next=j;//记录下标 } } v[next]=1;//标记下 for(j=1;j<=n;j++) { if(!v[j]&&dist[j]<dist[next]*map[next][j])//更新路径 dist[j]=dist[next]*map[next][j]; } } return dist[end]; } int main() { int i,j,k; int a,b; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++)//直接建图 for(j=1;j<=n;j++) { scanf("%lf",&map[i][j]); } scanf("%d",&m); while(m--) { scanf("%d%d",&a,&b); if(dijkstra(a,b)==0)//调用函数求解 printf("What a pity!\n"); else printf("%.3lf\n",dijkstra(a,b)); } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdoj 1596 find the safest road
标签:find the safest road hdoj 1596 最短路 图论
原文地址:http://blog.csdn.net/zhangxiaoxiang123/article/details/48026133