| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 18899 | Accepted: 6743 | 
Description
Input
Output
Sample Input
3 2 1 20.0 1 2 1.00 1.00 1.00 1.00 2 3 1.10 1.00 1.10 1.00
Sample Output
YES
Source
解释一下基本题意,SB—hypo有s货币,价值为V,他想获得更多的货币。身为一个妻管严,该怎么办?╮(╯▽╰)╭,无奈。。。货币交换公式 (B货币) = (A货币总量-佣金)*汇率;
输入N,M,S,V;
下面M行,line 1 代表货币1 到 货币2 的 汇率、佣金,货币2 到 货币1 的 汇率、佣金
line 2 代表货币2 到 货币3 的 汇率、佣金,货币3 到 货币2 的 汇率、佣金
打印SB-hypo能否增加收入?YES/NO
PS: 没什么难度,就是贝尔曼的模板,敲上就差不多A了,但是WA了两次,以为是精度的问题,但是看了一下DISCUSS之后,发现dis[]的初始化不对,应该为0,而不INF,因为这个题是逆向使用贝尔曼算法,找的不是负环,而是可以使之钱数无限增加的正环。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
const int INF = 1<<20;
const int N = 110;
const int Size = 9999;
using namespace std;
double mapp[N][N];
double dis[N],ANS;
int n,m,s,l;
double num;
struct node{
    int u,v;
    double hui,yong;
}edge[Size];
void init()
{
    l = 0;//若是找负环,dis[]应该初始化INF
    for(int i = 0;i<N;i++) //这里需要注意,因为找的是正环,初始化应该为0,但是不明白为什么不能为负
        dis[i] = 0;
}
int Bellamn()
{
    int flag = 0;
    for(int i = 0;i<n;i++)
    {
        flag = 0;
        for(int j = 0;j<l;j++)
        {     //以前是 dis[edge[j].v] > dis[edge[j].u] + edge[j].w; 更新最短路 
            if(dis[edge[j].v] < (dis[edge[j].u] - edge[j].yong)* edge[j].hui) // 更新相对最长路
                {
                    dis[edge[j].v] = (dis[edge[j].u] - edge[j].yong)* edge[j].hui;
                    flag = 1;
                }
        }
        if(flag==0)//更新完毕跳出
            break;
    }
    for(int j = 0;j<l;j++)
        {
            if(dis[edge[j].v] < (dis[edge[j].u] - edge[j].yong)* edge[j].hui)//判断正环
                {
                   return 1;
                }
        }
        return 0;
}
int main()
{
    int a,b;
    double c,d,cc,dd;
    while(~scanf("%d%d%d%lf",&n,&m,&s,&num))
    {
        init();
        dis[s] = num;
        for(int i = 0;i<m;i++)
        {
            scanf("%d%d%lf%lf%lf%lf",&a,&b,&c,&d,&cc,&dd);
            edge[l].u = a; edge[l].v = b; edge[l].hui = c; edge[l++].yong = d;
            edge[l].u = b; edge[l].v = a; edge[l].hui = cc; edge[l++].yong = dd;
        }
        int st = Bellamn();
        (st==1)?puts("YES"):puts("NO");
    }
    return 0;
}
POJ 1860 - Currency Exchange,布布扣,bubuko.com
原文:http://blog.csdn.net/wjw0130/article/details/30097117