跟bellmanford判负环是一样的,只不过这里是要求最大值,而且是乘积,如果最大乘积大于1则说明yes,否则为no。
由于这里是求最长路,所以dist数组要初始化为最小即0。还有就是注意将源点初始化为1,我这里源点是0而不是1,这里WA了一次。。
另外,这个题数据水了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
int main()
{
int n,kase=0;
while(cin>>n&&n)
{
map<string,int> mp;
for(int i=0; i<n; ++i)
{
string str;
cin>>str;
mp[str]=i;
}
double gl[35][35];
memset(gl,-1.0,sizeof(gl));
int m;
cin>>m;
for(int i=0; i<m; ++i)
{
string str1,str2;
double v;
cin>>str1>>v>>str2;
gl[mp[str1]][mp[str2]]=v;
}
double dist[35];
memset(dist,0,sizeof(dist));
dist[0]=1.0;
bool yes=false;
for(int i=0; i<n; ++i)
{
for(int j=0; j<n; ++j)
{
for(int k=0; k<n; ++k)
{
if(gl[j][k]==-1.0) continue;
if(dist[k]<dist[j]*gl[j][k])
{
dist[k]=dist[j]*gl[j][k];
}
}
}
if(dist[0]>1.0)
{
yes=true;
break;
}
}
printf("Case %d: ",++kase);
if(yes) puts("Yes");
else puts("No");
}
return 0;
}