1. 程式人生 > >poj 2240 (spfa判正環)

poj 2240 (spfa判正環)

題意:給你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;
}