• poj2240 Arbitrage


    这道题有好几种做法,这里用的是bellman。从起始币种src出发计算所有币种可兑换起始币种的最大值。

    用cin读取字符串貌似非常耗时,用了900+ms,差点超时。

    只是稍微用%s改下输入,就只用了32ms

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<vector>
    #define MAXD 32
    #define INF 0x3f3f3f3f
    using namespace std;
    int N,M;
    double graph[MAXD][MAXD];
    bool vis[MAXD][MAXD],flag;
    struct NODE
    {
        char name[MAXD];
        double d;
    }node[MAXD];


    void relax()
    {
        int i,j;
        for(i=1;i<=N;i++)
        {
            for(j=1;j<=N;j++)
            {
                if(vis[i][j]&&node[j].d<(node[i].d*graph[i][j]))
                {
                    node[j].d=node[i].d*graph[i][j];
                }
            }
        }
    }

    void bellman(int src)
    {
        int i;
        for(i=1;i<=N;i++)
        node[i].d=0;
        node[src].d=1.0;
        for(i=1;i<=N;i++)
        relax();
        if(node[src].d>1.0)
        flag=true;
    }

    int main()
    {
        //freopen("test.txt","r",stdin);
        int num=0;
        while(scanf("%d",&N)!=EOF)
        {
            if(N==0)
            return 0;
            int i,j;
            memset(vis,0,sizeof(vis));
            memset(graph,0,sizeof(graph));
            for(i=1;i<=N;i++)
            {
                scanf("%s",node[i].name);
            }
            scanf("%d",&M);
            char src[MAXD],des[MAXD];
            int first,second;
            double rate;
            for(i=1;i<=M;i++)
            {
                scanf("%s%lf%s",src,&rate,des);
                for(j=1;j<=N;j++)
                {
                    if(strcmp(node[j].name,src)==0)
                    {
                        first=j;
                    }
                    if(strcmp(node[j].name,des)==0)
                    {
                        second=j;
                    }
                }
                vis[first][second]=true;
                graph[first][second]=rate;
            }
            flag=false;
            bellman(1);
            if(flag)
            printf("Case %d: Yes\n",++num);
            else
            printf("Case %d: No\n",++num);
        }
        return 0;
    }
  • 相关阅读:
    公司程序升级 win2008
    软件
    crystal 2008升级(草稿)
    crystalreportviewers12的一些修改
    Crystal Report 2008
    deep learning 相关资料 Lei
    如何打印出符合acm要求的pdf Lei
    matlab常用命令 Lei
    Wilson Interval Lei
    Perl / Shell 脚本语言 Lei
  • 原文地址:https://www.cnblogs.com/longlongagocsu/p/2841013.html
Copyright © 2020-2023  润新知