思路:用BELLMAN-FORD算法求从源点SRC出发到各个顶点V(包括SRC本身)的最长路径长度,这里路径长度不是权值之和,而是权值乘积。
代码:
#include <stdio.h> #include <string.h> #define inf 1000000 #define MAXN 35 int n,m,a,b; char hash[MAXN][100]; double edge[MAXN][MAXN]; char str1[100],str2[100]; double len; double dist[MAXN]; int flag; int hex(char str[]) { for(int i=0; i<n; i++) if(strcmp(str,hash[i])==0) return i; return -1; } int addedge(int a,int b,double len) { edge[a][b]=len; } void bellman(int src) { flag=0; for(int i=0; i<n; i++) { dist[i]=0; } dist[src]=1.0; for(int k=0; k<n; k++) { for (int u=0; u<n; u++) { for (int j=0; j<n; j++) { if(dist[j]*edge[j][u]>dist[u]) { dist[u]=dist[j]*edge[j][u]; } } } } if(dist[src]>1.0) flag=1; } int main() { int casea=1; while (scanf("%d",&n),n) { for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { edge[i][j]=0; } } for (int i=0; i<n; i++) { scanf("%s",hash[i]); } scanf("%d",&m); for (int i=0; i<m; i++) { scanf("%s%lf%s",str1,&len,str2); a=hex(str1); b=hex(str2); addedge(a,b,len); } for (int i=0; i<n; i++) { bellman(i); if(flag) break; } if(flag) printf("Case %d: Yes\n",casea++); else printf("Case %d: No\n",casea++); } }