Bellman-Ford 找环
很久以前看见这题不敢动。。今天终于把它A了:-)
#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
using namespace std;
map<string,int> mp;
struct Edge
{
int s;
int e;
double v;
};
Edge e[300000];
double dist[1000];
int n,m;
bool bellman_ford()
{
int i,j;
for (i=1; i<=n; i++)
dist[i]=9999999;
dist[1]=1;
for (i=0; i<n-1; i++)
{
for (j=0; j<m; j++)
{
if (dist[e[j].e] < dist[e[j].s]*e[j].v)
dist[e[j].e]=dist[e[j].s]*e[j].v;
}
}
for (j=0; j<m; j++)
{
if (dist[e[j].e] < dist[e[j].s]*e[j].v)
return true;
}
return false;
}
int main()
{
int i,prob,j;
char str[1000],tar[1000];
double td;
prob=1;
while (1)
{
mp.clear();
scanf("%d",&n);
if (n == 0)
break;
for (i=1; i<=n; i++)
{
scanf("%s",str);
mp[str]=i;
}
scanf("%d",&m);
for (i=0; i<m; i++)
{
scanf("%s%lf%s",str,&td,tar);
e[i].s=mp[str];
e[i].v=td;
e[i].e=mp[tar];
}
if (bellman_ford())
{
printf("Case %d: Yes\n",prob);
prob++;
}
else
{
printf("Case %d: No\n",prob);
prob++;
}
}
}