poj 2240 (spfa判正環)
阿新 • • 發佈:2018-12-11
題意:給你m種貨幣,給你m種貨幣兌換規則,問通過這些規則最後能不能盈利。eg:1美元換0.5英鎊,1英鎊換10法郎,1法郎換0.21美元,這樣1美元能換0.5*10*0.21=1.05美元,淨賺0.05美元。
思路:spfa判變大環。
#include<iostream> #include<queue> #include<string> #include<cstring> #include<map> using namespace std; map<string,int> mp; int tot=0,vis[105]; double g[105][105],dis[105]; bool spfa(int sta) { queue<int> q; memset(dis,0,sizeof(dis)); q.push(1); memset(vis,0,sizeof(vis)); dis[sta]=1; vis[sta]=1; while(!q.empty()) { int f=q.front(); q.pop(); vis[f]=0; for(int i=1; i<=tot; i++) { if(dis[i]<dis[f]*g[f][i]) { dis[i]=dis[f]*g[f][i]; if(dis[sta]>1) { // cout<<dis[sta]<<endl; return 1; } if(!vis[i]) { q.push(i); vis[i]=1; } } } } return 0; } int main() { int n,m,cas=0; while(cin>>n&&n) { memset(g,0,sizeof(g)); tot=0; mp.clear(); string s; for(int i=0; i<n; i++) { cin>>s; mp[s]=++tot; } cin>>m; for(int i=1; i<=tot; i++) { for(int j=1; j<=tot; j++) { if(i!=j) g[i][j]=0; else g[i][j]=1; } } for(int i=0; i<m; i++) { string s1,s2; double w; cin>>s1>>w>>s2; g[mp[s1]][mp[s2]]=w; } cout<<"Case "<<++cas<<": "; if(spfa(1)) cout<<"Yes"<<endl; else cout<<"No"<<endl; // cout<<"dis"<<endl; /* for(int i=1; i<=n; i++) { cout<<dis[i]<<endl; }*/ } return 0; }