Arbitrage POJ - 2240
Posted qingyuyyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arbitrage POJ - 2240相关的知识,希望对你有一定的参考价值。
#include<iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; double d[35]; int h[1010],cnt,n,pre[35]; bool vis[35]; struct node { int u,v,next; double w; }p[1010]; void add(int u,int v,double w) { p[cnt].u=u; p[cnt].v=v; p[cnt].w=w; p[cnt].next=h[u]; h[u]=cnt++; } int spfa(int x) { memset(vis,0,sizeof(vis)); memset(pre,0,sizeof(pre)); memset(d,0,sizeof(d)); queue<int>q; while(!q.empty())q.pop(); q.push(x); vis[x]=1; pre[x]++; d[x]=100; while(!q.empty()) { int t=q.front(); q.pop(); vis[t]=0; if(pre[t]>n) return 1; for(int i=h[t];i!=-1;i=p[i].next) { node e=p[i]; if(d[e.v]<d[e.u]*e.w) { d[e.v]=d[e.u]*e.w; if(!vis[e.v]) { pre[e.v]++; vis[e.v]=1; q.push(e.v); } } } } return 0; } int main() { int m,flag; char s[35][50],a[50],b[50]; double c; int t=1; while(cin>>n && n) { cnt=0; for(int i=1;i<=n;i++) scanf("%s",s[i]); cin>>m; memset(h,-1,sizeof(h)); for(int k=0;k<m;k++) { cin>>a>>c>>b; int i,j; for(i=1;i<=n;i++) if(!strcmp(s[i],a)) break; for(j=1;j<=n;j++) if(!strcmp(s[j],b)) break; add(i,j,c); } flag=0; for(int i=1;i<=n;i++) if(spfa(i)) { flag=1; break; } if(flag) printf("Case %d: Yes ",t++); else printf("Case %d: No ",t++); } return 0; }
以上是关于Arbitrage POJ - 2240的主要内容,如果未能解决你的问题,请参考以下文章