题意应该很好理解,就不赘述了.
这道题是一道判正环的题
思路很简单,用floyd或者spfa判断一下是否存在正环就好了.因为我比较熟练floyd所以用了floyd.
开始给mapp[i][i]全都赋值1;
最后判断mapp[i][i]是否大于1就行.
要注意的是这里用了map,最开始没用,只是单纯用了数组来存,然后每次n重循环找s1,s2再给mapp[s1][s2]赋值,后来TLE了,才;;用了map
map是很好的将字符串作为数组名存储的工具.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
double mapp[40][40];
string s[40];
int n;
const int INF=0;
map<string,int>m;
void floyd()
{ int se = 0;
for(int k = 1;k <= n ;k ++)
for(int j = 1;j <= n ;j ++)
for(int i = 1;i <= n ;i ++)
if(mapp[j][i]<mapp[j][k]*mapp[k][i] )
mapp[j][i] = mapp[j][k]*mapp[k][i];
for(int k = 1;k <= n ;k ++)
if(mapp[k][k]>1)
{se = 1;
break;
}
if(se == 1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
int main(){
int Case = 1;
while(scanf("%d",&n)&&n)
{
for(int i = 1;i <= n;i++)
{
cin>>s[i];
m.insert(make_pair(s[i],i));
mapp[i][i]= 1;
}
int x;
scanf("%d",&x);
for(int i = 1;i <= x;i++)
{ int p ,q;
string s1,s2;
double d;
cin>>s1>>d>>s2;
mapp[m[s1]][m[s2]] = d;
}
cout<<"Case "<<Case<<": ";
floyd();
Case++;
}
}