poj 2240 Arbitrage (Floyd)

链接:poj 2240

题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率。

如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 BritishPound。

问在这N种货币中是否存在货币经过若干次兑换后,兑换成原来的货币能够使货币量添加。

思路:本题事实上是Floyd的变形。将变换率作为构成图的路径的权值。只是构成的图是一个有向图。

最后将松弛操作变换为:if(dis[i][j]<dis[i][k]*dis[k][j])。

#include<stdio.h>
#include<string.h>
int main()
{
    int n,m,i,j,k,l,r,t=0;
    char s[35][30],s1[30],s2[30];
    double a[35][35],c;
    while(scanf("%d",&n)!=EOF){
        if(n==0)
            break;
        t++;
        memset(a,0,sizeof(a));         //開始都初始化为0了,而不是无穷大,当然能够初始化为无穷小
        for(i=1;i<=n;i++){
            scanf("%s",s[i]);
            a[i][i]=1.0;               //自己的税率初始化为1
        }
        scanf("%d",&m);
        while(m--){
            scanf("%s%lf%s",s1,&c,s2);
            l=r=0;
            for(i=1;i<=n;i++){
                if(strcmp(s1,s[i])==0)            //存在自己对自己的兑换率,全部两个字符串可能相等
                    l=i;
                if(strcmp(s2,s[i])==0)            //之前由于加了 else 将上述情况排除了,一直wa
                    r=i;
                if(l&&r)
                    break;
            }
            a[l][r]=c;
        }
        for(k=1;k<=n;k++)                     //Floyd算法
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                    if(a[i][k]*a[k][j]>a[i][j])             //松弛条件
                        a[i][j]=a[i][k]*a[k][j];
        k=0;
        for(i=1;i<=n;i++)
            if(a[i][i]>1){
                k=1;
                break;
            }
        if(k)
            printf("Case %d: Yes\n",t);
        else
            printf("Case %d: No\n",t);
    }
    return 0;
}
时间: 2024-07-30 10:16:53

poj 2240 Arbitrage (Floyd)的相关文章

poj 2240 Arbitrage(bellman-ford 判断正环)

http://poj.org/problem?id=2240 基本和poj 1860相同 只是把单点变成了任意点 做完1860再做这题就完全把思路套上就过了 做完才发现网上的题解都用的是floyd 不过整体思路都是大同小异吧 不过在效率上好像就低下了太多= = #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<stack> #include<

poj 2240 Arbitrage(Bellman-Ford算法学习)

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15806   Accepted: 6648 Description Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currenc

POJ 2240 - Arbitrage(最短路)

题意: 给出一些货币和货币之间的兑换比率,问是否可以使某种货币经过一些列兑换之后,货币值增加. 举例说就是1美元经过一些兑换之后,超过1美元.可以输出Yes,否则输出No. 分析: 首先我们要把货币之间的关系转化成一张图.转化时,用STL里面的map很方便. 为每种货币分配一个序列号,一个序列号代表了一个图中间的NODE,而node之间的edge用汇率表示. 一开始用Dijkstra算法做,死活AC不了,网友给的理由是: 由于Dijkstra算法不能处理带有负权值的最短路,但此题中,两种货币之间

POJ 2240 Arbitrage(SPFA+邻接矩阵)

( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<queue> using namespace std; const int MAXN=40; int n,m; double

POJ Stockbroker Grapevine(floyd)

https://vjudge.net/problem/POJ-1125 题意: 题意不是很好理解,首先输入一个n,表示有n个股票经纪人,接下来输入n行,每行第一个数m为该股票经纪人认识的经纪人数,然后输入m对数(a,t),表示第i个经纪人把消息传给第a个经纪人所需要的时间. 计算将消息传遍所有人所需要的最少时间. 思路: 起点任意,用floyd比较好.因为floyd求出的是每两点之间的最短路,所以最后计算最小时间时,需要先取最大值,比如说1号经纪人为起点,因为谁都可能为终点,所以枚举所有人,将最

[HDOJ1217]Arbitrage(floyd)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 题意:给一些汇率,问是否可以套利. 套利就是经过一些汇率的转换,最终使得本金额比起始金额大. 最短路跑所有的汇率情况,看看有没有使得最终的汇率是大于1的. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏

POJ 2240 -- Arbitrage(Bellman-Ford)

POJ 2240 -- Arbitrage(Bellman-Ford) 题意: 已知n种货币,以及m种货币汇率及方式,问能否通过货币转换,使得财富增加. Bellman-ford 算法: 一个具有n个顶点的图如果不存在环,则从顶点x,到顶点y,最多经过n-1条边(要考虑连通性,每个顶点最多经过 1 次),因此 x 到 y 的最短路 最多经过 n - 1 次松弛操作(就是更新长度)就应该出现,如果第 n 次松弛还可以得到最优,那么这个图就肯定是存在环了(直接用Dijkstra 就无法得到最优的,环

POJ 3414 Pots(罐子)

p.MsoNormal { margin-bottom: 10.0000pt; font-family: Tahoma; font-size: 11.0000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 24.0000pt } span.10 { font-family: "Times New Rom

poj 3399 Product(模拟)

# include <stdio.h> # include <string.h> # include <algorithm> using namespace std; int cmp(int x,int y) { return x>y; } int main() { int a[110],a1[110],a2[110],ans[110]; int n,k,k1,k2,i,k3; while(~scanf("%d%d",&n,&k