http://acm.hdu.edu.cn/showproblem.php?pid=1596
最短路
ps:0可以理解为那两个城市之间没有直接的通道,少看了这个条件错惨,在sx和zbw两位祖先的帮助下认清了这个问题
#include <iostream> #include <string> using namespace std; const double esp=1e-11; const int maxn=1001; int n; double Map[maxn][maxn]; double dis[maxn]; int vis[maxn]; double Dijkstra(int s,int t) { memset(vis,0,sizeof(vis)); memset(dis,0,sizeof(dis)); dis[s]=1; for(int i=0;i<n;i++) { int u; double ans=-1; for(int j=1;j<=n;j++) if(!vis[j] && dis[j]>ans) { ans=dis[j]; u=j; } vis[u]=1; if(u==t)return ans; for(int j=1;j<=n;j++) if(!vis[j] && dis[j]<Map[u][j]*dis[u]) dis[j]=Map[u][j]*dis[u]; } } int main() { while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%lf",&Map[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(Map[i][j]>1-esp&&Map[i][j]<1+esp) Map[i][j]=0; int m,s,t; scanf("%d",&m); while(m--) { scanf("%d%d",&s,&t); double ans=Dijkstra(s,t); if(ans) printf("%.3lf\n",ans); else puts("What a pity!"); } } return 0; }