本题想用spfa算法实现,昨天看了很长时间没弄个一清二白,╮(╯▽╰)╭,今天早晨趁着精神好,赶紧看下,还真弄出来了,其实还是和dijkstra相差无几,只是昨个儿下午太不给力了,看来状态不好时真不能搞算法,不然越搞越昏,赔了时间又折煞自己的心情……
http://acm.hdu.edu.cn/showproblem.php?pid=1596
#include <iostream> #include<cstdio> #include<string.h> using namespace std; int n,m,st,ed,front,rear; double mat[1005][1005],dis[1005]; int v[1005],q[1000001]; void Spfa() { int p; while(front<rear)//模拟栈,直到栈为空 { p=q[front++]; v[p]=0; for(int i=0;i<n;i++) { if(mat[p][i]==0||p==i) continue; if(dis[p]*mat[p][i]>dis[i]) { dis[i]=dis[p]*mat[p][i]; if(!v[i]) { q[rear++]=i; v[i]=1; } } } } } int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%lf",&mat[i][j]); scanf("%d",&m); while(m--) { scanf("%d%d",&st,&ed); memset(v,0,sizeof(v)); memset(dis,0,sizeof(dis)); v[st-1]=dis[st-1]=1; front=0; rear=1; q[front]=st-1; Spfa(); if(dis[ed-1]!=0) printf("%.3lf\n",dis[ed-1]); else puts("What a pity!"); } } }