陆历川

导航

poj2240

一个关于套利的题,就是判断是否有正环,我这里是用的SPFA,只要判断出来一种货币初始为1,最后变得大于1就代表是正环,要注意一下最后对vector的清空,当时从1开始清空,导致wa了两次,找了半天,尽量不要出现小的错误还是很致命的

#include <iostream>
#include<string.h>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
#define MAX  99999999;
double dis[100+6];
double vis[100+6];
int time[100+6];
int n;
char name[50][100];
double fir;
typedef struct
{
    int x;
    double rate;
    //double cost;
}point;
int judge_name( char* str)
{
    for(int i=0;i<n;i++)
    {
        if(strcmp(str,name[i])==0)
            return i;
    }
}
vector<point> p[101];
int Spfa(int start)
{
    queue<int> Q;
    memset(time,0,sizeof(time));
    memset(vis, 0, sizeof(vis));
    memset(dis, 0, sizeof(dis));
    dis[start] = 1.0;
    vis[start] = true;
    time[start]++;
    Q.push(start);
    while (!Q.empty()){
        int temp = Q.front();
        Q.pop();
         vis[temp] = false;
        for(int i=0; i<p[temp].size(); i++)
        {
            int v=p[temp][i].x;
            double w=p[temp][i].rate;

            if (dis[v] <dis[temp]*w)
            {
                dis[v] = dis[temp]*w;
                if(dis[start]>1.0)
                {
                //    cout<<start<<endl;
               //     cout<<dis[start]<<endl;;
                    return true;
                }
                if (!vis[v])
                {
                    Q.push(v);
                    vis[v] = true;
                              }
            }
        }
    }
    return false;
}
int main()
{
    int m,s;
    int total=0;
    while(cin>>n,n)
    {
        for(int i=0;i<n;i++)
            cin>>name[i];
        int m;
        cin>>m;
        char str1[100],str2[100];
        double f;
        point node;
        for(int i=0;i<m;i++)
        {
            cin>>str1>>f>>str2;
            node.x=judge_name(str2);
            node.rate=f;
            p[judge_name(str1)].push_back(node);
        }
       int flag=0;
       for(int i=0;i<n;i++)
       {
           if(Spfa(i))
           {
               flag=true;
               break;
           }
       }
       if(flag)
       printf("Case %d: Yes\n",++total);
       else
       printf("Case %d: No\n",++total);
       for(int i=0;i<n;i++)
        p[i].clear();
    }
    return 0;
}

 

posted on 2017-01-18 17:25  陆历川  阅读(102)  评论(0编辑  收藏  举报