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;
}

 

posted @ 2012-12-31 21:18  longlongago  Views(138)  Comments(0Edit  收藏  举报