给出n种货币和m种汇率 问经过几次交易后能不能增值 Bellman或者SPFA判断正环即可
主要想吐槽POJ的编译器……G++1A cin用了750ms 险过。。还是关了同步的状态下,。 不用cin也跑了235ms,。。后来用C++ CE……然后测了几次发现是mapCE了……总之试了好多次发现少了string头文件,。cstring头文件在c++编译器下可能少些方法 总之…………写全头文件很重要
上代码
#include
using namespace std;
typedef struct Edge
{
int v,next;
double w;
}Edge;
Edge eg[999];
int head[33],in[33];
double dis[33];
bool vis[33];
map <string,int> mp;
int n,m;
bool SPFA()
{
int u,v,i;
double w;
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
for(i = 1; i <= n; ++i)
dis[i] = 0;
dis[1] = 1;
queue <int> q;
q.push(1);
while(!q.empty())
{
u = q.front();
q.pop();
vis[u] = 0;
for(i = head[u]; i != -1; i = eg[i].next)
{
v = eg[i].v;
w = eg[i].w;
if(dis[v] < dis[u]*w)
{
dis[v] = dis[u]*w;
if(!vis[v])
{
in[v]++;
if(in[v] == n) return 1;
q.push(v);
vis[v] = 1;
}
}
}
}
return 0;
}
int main()
{
char to[666],from[666];
int i,z = 0;
while(~scanf("%d",&n) && n)
{
memset(head,-1,sizeof(head));
for(i = 1; i <= n; ++i)
{
scanf("%s",to);
mp[to] = i;
}
scanf("%d",&m);
for(i = 0; i < m; ++i)
{
scanf("%s %lf %s",from,&eg[i].w,to);
eg[i].v = mp[to];
eg[i].next = head[mp[from]];
head[mp[from]] = i;
}
printf("Case %d: %s\n",++z,SPFA()? "Yes": "No");
}
return 0;
}