hdu 1596 find the safest road
dijkstra 的一点小变换
1,+------>*
2,int---->double
对于dijkstra算法注意:
1、单向还是双向图,考虑清楚
2、注意那个maxInt这个值超不超,够不够
3、注意是否两点间有多条路径
4、分清变量是double型的还是int型的
5、注意主函数中初始化map[][]中的点边不要搞错(注意所有初始化,正确命名好变量)
#include"stdio.h" #include"string.h" int n,s,e,t; double map[1001][1001],f[1001]; int mark[1001]; double min(double x,double y) { return x<y?x:y; } void dijkstra() { int i,j,k; double m; for(i=1;i<=n;i++) f[i]=map[s][i]; f[s]=0; memset(mark,0,sizeof(mark)); f[s]=1; for(i=1;i<=n;i++) { m=0; for(j=1;j<=n;j++) { if(!mark[j]&&f[j]>m) { m=f[j];k=j; } } if(m==0)break; mark[k]=1; for(j=1;j<=n;j++) if(!mark[j]&&f[k]*map[k][j]-f[j]>0.000001) f[j]=f[k]*map[k][j]; } if(f[e])printf("%.3f\n",f[e]); else printf("What a pity!\n"); } int main() { int i,j; double a; while(scanf("%d",&n)!=-1) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%lf",&a); map[i][j]=a; } mark[i]=0; } scanf("%d",&t); while(t--) { scanf("%d%d",&s,&e); dijkstra(); } } return 0; }