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

来源:互联网 发布:哪些网游支持mac 编辑:程序博客网 时间:2024/05/22 08:24

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;}
阅读全文
0 0
原创粉丝点击