【bellman-Ford判断正权回路】POJ - 1860 Currency Exchange

Problem Description

输入n,m,s,v,分别代表n中货币类型,m中兑换渠道,自己拥有的货币类型,自己拥有货币价值。接下来m行,每行a,b,rab,cab,rba,cba.分别代表a类型货币,b类型货币,a-b兑换率,a-b手续费,b-a兑换率,b-a手续费。

**思路:判断自己拥有的货币类型出发,回到自己看看有没有正权回路,有就输出YES。

#include<cstdio>
#include<cstring>
struct node
{
    int a, b;
    double rab, cab;
};
node e[205];
int n, m, s, cnt;
double dist[105];
double v;
int bellman_Ford()
{
    memset(dist, 0, sizeof(dist));
    dist[s] = v;
    int i, j;
    for(i = 0; i < n - 1; i++)
    {
        int flag = 0;
        for(j = 0; j < cnt; j++)
        {
            if(dist[e[j].b] < (dist[e[j].a] - e[j].cab) * e[j].rab)
            {
                dist[e[j].b] = (dist[e[j].a] - e[j].cab) * e[j].rab;
                flag = 1;
            }
        }
        if(!flag) break;//如果不更新了退出循环,降低时间复杂度
    }
    //判断是否有正权回路
    for(j = 0; j < cnt; j++)
    {
        if(dist[e[j].b] < (dist[e[j].a] - e[j].cab) * e[j].rab)
            return 0;//还能更新,有正权回路
    }
    return 1;
}
int main()
{
    int a, b;
    double rab, cab, rba, cba;
    while(~scanf("%d %d %d %lf", &n, &m, &s, &v))
    {
        cnt = 0;
        while(m--)
        {
            scanf("%d %d %lf %lf %lf %lf", &a, &b, &rab, &cab, &rba, &cba);
            e[cnt].a = a;
            e[cnt].b = b;
            e[cnt].rab = rab;
            e[cnt++].cab = cab;
            e[cnt].a = b;
            e[cnt].b = a;
            e[cnt].rab = rba;
            e[cnt++].cab = cba;
        }
        if(bellman_Ford()) printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}
    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/bbbbswbq/article/details/73459891
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞