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;

}

你可能感兴趣的:(HDU)