HDU 1217 Arbitrage (初学Floyed)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1217

 

题意:转化成图,然后求是否存在某回路,其权值的积大于1

 

Floyed是求任意两点间的最短路径的,用了动态规划,思想和松弛一样,其中有个k,是指最短路径的中间点都在集合1....k里,然后k从小到大推,当k最大的时候就得到结果。。。。松弛思想在g[i][k]*g[k][j]

和g[i][j]中选择。。。

 

而这题则是求最大,且是乘积。。。所以要改下。。。。但是转化成图哪里就不用多说了,但是我才发现map A<string, int> 中的string 可以用char str[...]来代替,即可以A[str] = 6,其中str是char型而不是string

 

代码:

 

#include <iostream>
#include <string>
#include <map>
using namespace std;

const int M = 50;

double g[M][M];

int Floyed(int n)
{
    for (int k = 1; k <= n; k++)
    {
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (g[i][j] < g[i][k] * g[k][j])
                {
                    g[i][j] = g[i][k] * g[k][j];
                }
            }
        }
    }

    for (int i = 1; i <= n; i++)
    {
        if (g[i][i] > 1)
        {
            return 1;
        }
    }
    return 0;
}


int main()
{
    int n;
    int t = 0;
    while (~scanf("%d", &n), n)
    {
        map <string, int> A;
        for (int i = 1; i <= n; i++)
        {
            string str;
            cin >> str;
            A[str] = i;
        }

        int m;
        scanf("%d", &m);

        memset(g, 0, sizeof(g));

        while (m--)
        {
            string a, b;
            double c;
            cin >> a >> c >> b;
            
            if (g[A[a]][A[b]] < c)
            {
                g[A[a]][A[b]] = c;
            }

        }
    
        printf("Case %d: ", ++t);
        
        if (Floyed(n))
        {
            puts("Yes");
        }
        else
        {
            puts("No");
        }
    }
    return 0;
}

posted on 2012-08-14 20:53  [S*I]SImMon_WCG______*  阅读(344)  评论(0编辑  收藏  举报

导航