题目大意&&思路:汇套问题,特殊的是会有自环(注意哦),搞的我RE了。固执的用SPFA去做,可惜还没写哈希,下次在完善哈希吧。小数据的题目用大数据的态度去做
其实对这道题来说:主要是分析用什么来表示到其他节点 的问题,在这里用的是:dis[当前节点]*此节点到所有出边节点的汇率 和 出边节点的原汇率比较。大则改变。而至于自环问题,这是图论最简单的特殊情况,包括重边啊,有环啊,这些都得习惯啊
AC program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
#define inf 999999991
#define hash 9991
int n,m;
int hh[10000];
int visited[1000],st[1000];
double dis[1000];
int ff[35];
string str[35];
int flag;
struct node
{
int x;
double value;
int next;
}e[1000];
void init1()
{
__int64 tmp;
char buf[100];
for(int i=1;i<=n;i++)
{
scanf("%s",buf);
str[i]=buf;
}
}
int find(string tmp)
{
for(int i=1;i<=n;i++)
if(str[i]==tmp)
return i;
}
void init2()
{
cin>>m;
char aa[20],bb[20];
int u,v;
double w;
memset(st,0,sizeof(st)); ///
memset(e,0,sizeof(e));///
for(int i=1;i<=m;i++)
{
scanf("%s%lf%s",aa,&w,bb);
u=find(aa);
v=find(bb);
//cout<<"u v "<<u<<" "<<v<<endl;
if(u==v&&w-1>0.00001){flag=1;return ;}//note3
e[i].x=v;
e[i].value=w;
e[i].next=st[u];
st[u]=i;
}
}
void init3()
{
memset(ff,0,sizeof(ff));///
}
bool fn(double a,double b)
{
if(b-a>0.00001)
return true;
return false;
}
bool spfa()
{
for(int i=1;i<=n;i++)
{
visited[i]=0;
dis[i]=0;//note1
}
visited[1]=1;
dis[1]=1;//note2
queue<int>que;
que.push(1);
ff[1]++;
int tmp=st[1];
int cur;
int k=0;
while(!que.empty())
{
cur=que.front();
tmp=st[cur];
que.pop();
visited[cur]=0;
while(tmp!=0)
{
if(fn(dis[e[tmp].x],dis[cur]*e[tmp].value))
{
dis[e[tmp].x]=dis[cur]*e[tmp].value;
if(visited[e[tmp].x]==0)
{
que.push(e[tmp].x);
ff[e[tmp].x]++;
if(ff[e[tmp].x]>=n)
return false;
visited[e[tmp].x]==1; ///
}
}
tmp=e[tmp].next;
}
}
return true;
}
int main()
{
int cas=1;
while(scanf("%d",&n)!=EOF,n)
{
init1();
flag=0;
init2();
if(flag)
{
printf("Case %d: Yes\n",cas++);
continue;
}
init3();
if(!spfa())
printf("Case %d: Yes\n",cas++);
else
printf("Case %d: No\n",cas++);
}
system("pause");
return 0;}