这个题目意思很明确
int to,next;
double rate;
e[++lon].to=to;
e[lon].rate=w;
e[lon].next=head[from];
head[from]=lon;
memset(count,0,sizeof(count));
memset(text,0,sizeof(text));
memset(dist,0,sizeof(dist));
int front=1,end=1;
que[end]=t;
text[t]=1;
dist[t]=1;
while(front<=end)
{
int tmp=que[front++];
if(count[tmp]>n+2)
{
ture=1;
return(0);
}
text[tmp]=0;
for(int k=head[tmp];k!=-1;k=e[k].next)
{
if(dist[e[k].to]
{
dist[e[k].to]=dist[tmp]*e[k].rate;
if(!text[e[k].to])
{
text[e[k].to]=1;
que[++end]=e[k].to;
count[e[k].to]++;
}
}
}
}
int time=0;
while(scanf("%d",&n),n)
{
memset(head,-1,sizeof(head));
lon=1;
for(int i=1;i<=n;i++)
scanf("%s",a[i]);
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
char tmp1[maxn],tmp2[maxn];
double rate;
scanf("%s %lf %s",tmp1,&rate,tmp2);
int i,j;
for(i=1;i<=n;i++)
if(strcmp(tmp1,a[i])==0) break;
for(j=1;j<=n;j++)
if(strcmp(tmp2,a[j])==0) break;
edgemake(i,j,rate);
}
ture=0;
for(int i=1;i<=n;i++)
spfa(i);
if(ture)
printf("Case %d: Yes",++time);
else
printf("Case %d: No",++time);
printf("\n");
}
return 0;
就是找一个环使得钱能增加,也就是一个正环
我的做法,每个点依次做spfa,判断有没有正环。
#include
#include
#include
using namespace std;
const int maxn=1001;
char a[31][1001];
int head[31],lon,n;
struct
{
}e[maxn];
int edgemake(int from,int to,double w)
{
}
int ture;
int que[1000001],text[101],count[101];
double dist[101];
int spfa(int t)
{
//
printf("%d %d %f\n",t,tmp,dist[tmp]);
}
int main()
{
}