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
#include<stdio.h> #include<string.h> #define M -10900000 #define max(a,b) (a)>(b)?(a):(b) double x[1001][1001]; int n,m,q,t; void dijkstra() { int i,j,k; int s[1001]; memset(s,0,sizeof(s)); double p[1001]; for(i=1;i<=n;i++) p[i]=0;//刚开始错写成p[i ]=M; p[q]=1; while(1) { k=-1; for(i=1;i<=n;i++) if(!s[i]&&(k==-1||p[k]<p[i])) k=i; if(k==-1) break; s[k]=1; for(j=1;j<=n;j++) if(k!=j) p[j]=max(p[j],p[k]*x[k][j]);//该地方刚开始忽略了 } if(p[t]) printf("%.3lf\n",p[t]); else printf("What a pity!\n"); } int main() { while(scanf("%d",&n)!=EOF) { int i,j,k; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%lf",&x[i][j]); //if(x[i][j]==0)//x[i][j]=M;该地方多余 } scanf("%d",&m); for(i=0;i<m;i++) { scanf("%d%d",&q,&t); dijkstra(); } } return 0; }
再贴一个spfa算法写的代码:
#include<stdio.h> #include<queue> #include<string.h> using namespace std; double x[1005][1005],vist[8000]; int vid[3000],head[3000],t,N,M,flag,on,tw; void spfa() { for(int i=1;i<=N;i++) { vist[i]=0;vid[i]=0; } queue<int> q; vid[on]=1; q.push(on); vist[on]=1;////刚开始这个地方考虑错了,错误认为vist一直从1开始,如果不从1开始就不能遍历全部节点,实际上从已知的起点开始赋值1就行了 while(!q.empty()) { int u=q.front(); q.pop(); vid[u]=0; for(int i=1;i<=N;i++) { if(vist[i]<vist[u]*x[u][i]) { vist[i]=vist[u]*x[u][i]; if(!vid[i]) { q.push(i); vid[i]=1; } } } } } int main() { while(scanf("%d",&N)!=EOF) { t=0; flag=1; memset(head,-1,sizeof(head)); int i,j,c,m; double a; for(i=1;i<=N;i++) for(j=1;j<=N;j++) scanf("%lf",&x[i][j]); scanf("%d",&m); for(i=0;i<m;i++) { scanf("%d%d",&on,&tw); spfa(); if(vist[tw]) printf("%.3lf\n",vist[tw]); else printf("What a pity!\n"); } } return 0; }