Arbitrage——(Floyd、SPFA)

Arbitrage

题意:给定钱币兑换汇率,然后问是否可以套利。

Floyd(判断从i出发回到i的值(存着的)是否大于了1)

#include <iostream>
#include <math.h>
#include <algorithm>
#include <cmath>
#include <string>
#include <stdio.h>
#include<queue>
#include<map>
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int,int>P;
int n,m,t;
char a[1005],b[1005],c[1005];
double d[1005][1005];
double x;
map<string,int>str;
void floyd()
{
    for(int k=1; k<=n; k++)
    {
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                d[i][j]=max(d[i][j],d[i][k]*d[k][j]);
            }
        }
    }
}
int main()
{
    t=1;
    while(~scanf("%d",&n)&&n)
    {
        memset(d,INF,sizeof(d));
        for(int i=1; i<=n; i++)
        {
            cin>>a;
            str[a]=i;
            d[i][i]=1;
        }
        scanf("%d",&m);
        for(int i=1; i<=m; i++)
        {
            cin>>b>>x>>c;
            d[str[b]][str[c]]=x;
        }
        floyd();
        int flag=0;
        for(int i=1; i<=n; i++)
        {
            if(d[i][i]>1)
            {
                flag=1;
                break;
            }
        }
        if(flag==1)
            printf("Case %d: Yes\n",t++);
        else
            printf("Case %d: No\n",t++);
    }
    return 0;
}

spfa

#include <iostream>
#include <math.h>
#include <algorithm>
#include <cmath>
#include <string>
#include<string.h>
#include <stdio.h>
#include<queue>
#include<map>
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int,int>P;
int n,m,t;
int vis[1005];
char a[1005],b[1005],c[1005];
double d[1005][1005],dis[1005];
double x;
map<string,int>str;
int spfa(int start)
{
    memset(dis,0,sizeof(dis));
    memset(vis,0,sizeof(vis));
    vis[start]=1;
    dis[start]=1.0;
    queue<int>q;
    while(!q.empty())
        q.pop();
    q.push(start);
    while(!q.empty())
    {
        int p=q.front();
        q.pop();
        vis[p]=0;
        for(int i=1; i<=n; i++)
        {
            if(dis[p]*d[p][i]>dis[i])
            {
                dis[i]=dis[p]*d[p][i];
                if(dis[start]>1)//!!!!!!
                {
                    return 1;
                }
                if(!vis[i])
                {
                    vis[i]=1;
                    q.push(i);
                }
            }
        }
    }
    return 0;
}
int main()
{
    t=1;
    while(~scanf("%d",&n)&&n)
    {
        memset(d,0,sizeof(d));
        for(int i=1; i<=n; i++)
        {
            cin>>a;
            str[a]=i;
            d[i][i]=1;
        }
        scanf("%d",&m);
        for(int i=1; i<=m; i++)
        {
            cin>>b>>x>>c;
            d[str[b]][str[c]]=x;
        }
        int flag=0;
        for(int i=1; i<=n; i++)
        {
            if(spfa(i))
            {
                flag=1;
                break;
            }
        }
        if(flag==1)
            printf("Case %d: Yes\n",t++);
        else
            printf("Case %d: No\n",t++);
    }
    return 0;
}
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页