思路:用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++);
}
}
浙公网安备 33010602011771号