HDU1596 find the safest road---(最短路径dijkstra,#变形#)
http://acm.hdu.edu.cn/showproblem.php?pid=1596
分析:
题目要找一条安全度最高的路,安全度计算方法 Safe(P) = s(e1)*s(e2)…*s(ek) e1,e2,ek是P 上的边
在Dijkstra算法的基础上稍加改动
#include "cstdio" #include "cstring" #include "algorithm" using namespace std; #define inf 0x3f3f3f3f #define MAX 1005 double map1[MAX][MAX],dis[MAX]; int vis[MAX]; ///要找安全系数最高的路径 void dijkstra(int s,int n) { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) dis[i]=map1[s][i]; dis[s]=0; vis[s]=1; double min1; int pos; for(int i=1;i<n;i++) { min1=0; for(int j=1;j<=n;j++) { if(!vis[j]&&min1<dis[j])///找最大dis min1=dis[pos=j]; } vis[pos]=1; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<dis[pos]*map1[pos][j])///选取更大安全度 dis[j]=dis[pos]*map1[pos][j]; } } } int main() { int n; while(~scanf("%d",&n)&&n) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%lf",&map1[i][j]); } } int q,s,e; scanf("%d",&q); for(int i=0;i<q;i++) { scanf("%d%d",&s,&e); dijkstra(s,n); if(dis[e]==0)///不能到达,即安全度为0 printf("What a pity!\n"); else printf("%.3lf\n",dis[e]); } } return 0; }