Currency Exchange -spfa判断正环

Currency Exchange

 POJ - 1860 

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 151
#define ll long long
ll n,m,s,a,b;
bool vis[maxn];
double v,dis[maxn];
double s1,s2,s3,s4;
double mmp[maxn][maxn];
double cost[maxn][maxn];
void spfa(int s)
{
    queue<int>q;
    dis[s]=v;
    q.push(s);
    vis[s]=1;
    while(!q.empty())
    {
        int top=q.front();
        q.pop();
        vis[top]=0;
        for(int i=1; i<=n; i++)
        {
            if(dis[i]<(dis[top]-cost[top][i])*mmp[top][i])
            {
                dis[i]=(dis[top]-cost[top][i])*mmp[top][i];
                if(!vis[i])
                {
                    vis[i]=1;
                    q.push(i);
                }
                if(dis[s]>v)
                {
                    cout<<"YES"<<endl;
                    return ;
                }
            }
//            cout<<dis[i]<<endl;
        }
    }
    cout<<"NO"<<endl;
}
int main()
{
    cin>>n>>m>>s>>v;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
        {
            if(i==j)
                mmp[i][j]=1;
            else
                mmp[i][j]=0;
            cost[i][j]=0;
            vis[i]=0;
            dis[i]=0;
        }
    while(m--)
    {
        cin>>a>>b>>s1>>s2>>s3>>s4;
        mmp[a][b]=s1;
        mmp[b][a]=s3;
        cost[a][b]=s2;
        cost[b][a]=s4;
//        cout<<mmp[a][b]<<" "<<mmp[b][a]<<" "<<cost[a][b]<<" "<<cost[b][a]<<endl;
    }
    spfa(s);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/82791090