poj 1860 Currency Exchange

在前些日子,学了bellman_ford。
感觉核心思想就是对条边进行n-1个松弛操作。。
因为路径上最多只有n个节点,所以路径在怎么搞,最多只有n-1条边(正环想想就知道一定被去除了)。这样就保证了在没有负环的情况下的最短路了。
如果有负环,这个程序会一遍又一遍地跑负环。所以直行完之后,我们再进行一波松弛,就可以知道负环的存在,构成,权重。

然后网上看了一下人家的模板。。 发现了break这个东西。
如果你用来寻找负环,那么break就说明我这一波松弛以及没用了,没必要进行下一波松弛了。。 这里我直接return了。。

代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
#define maxn 10010
int cnt;
int n;
int m,who;
double much;
struct sb
{
    int a;
    int b;
    double t;
    double me;
}wa[maxn*2];
double way[maxn];
bool boom()
{
    for(int i=1;i<=n;i++)
    {
        way[i]=0;
    }
    way[who]=much;
    for(int i=1;i<=n-1;i++)
    {
        bool flag=false;
        for(int j=1;j<=cnt;j++)
        {
            if(way[wa[j].b]<(way[wa[j].a]-wa[j].t)*wa[j].me)
            {
                way[wa[j].b]=(way[wa[j].a]-wa[j].t)*wa[j].me;
                flag=true;
            }
        }
        if(!flag)
            return false;
    }
    for(int j=1;j<=cnt;j++)
    {
        if(way[wa[j].b]<(way[wa[j].a]-wa[j].t)*wa[j].me)
        {
            return true;
        }
    }
    return false;
}
int main()
{
    while(scanf("%d%d%d%lf",&n,&m,&who,&much)==4)
    {
        cnt=0;
        int a,b;
        double s1,t1,s2,t2;
        for(int i=1;i<=m;i++)
        {
            cin>>a>>b>>s1>>t1>>s2>>t2;
            cnt++;
            wa[cnt].a=a;
            wa[cnt].b=b;
            wa[cnt].me=s1;
            wa[cnt].t=t1;
            cnt++;
            wa[cnt].a=b;
            wa[cnt].b=a;
            wa[cnt].me=s2;
            wa[cnt].t=t2;
        }
        if(boom())
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}

你可能感兴趣的:(poj,b-ford)