HDU-1217-Arbitrage

ACM模版

描述

描述

题解

真是炸了,题倒是十分简单,无非是求任意两点之间的最短路(变种,其实不是求最短,而是求最大连乘),之间用Floyd搞搞就行,可是,我一开始用结构体存储,却一直出现bug,到现在我都没有找到问题在哪儿(代码One),求大神们一瞥,给予我些许建议……

之后,我只好把结构体去了,直接开二维数组存,顺利AC(代码Two),真是个让人悲伤的故事……

代码

One:

//  WA
//#include <cstdio>
//#include <iostream>
//#include <string>
//#include <map>
//
//using namespace std;
//
//typedef double typec;
//
//map<string, int> money;
//
///*
// *  Floyd算法,求从任意节点i到任意节点j的最短路径
// *  edges[][]:初始化为0(edges[i][i]:初始化为1)
// */
//const int VertexNum = 33;
//
//typedef struct
//{
//    int N;                              //  图中当前的顶点数
//    typec edges[VertexNum][VertexNum];  //  邻接矩阵,可看做边表
//} MGraph;
//
//void Floyd(MGraph G)
//{
//    int i, j, k, n = G.N;
//
//    for (k = 1; k <= n; k++)
//    {
//        for (i = 1; i <= n; i++)
//        {
//            for (j = 1; j <= n; j++)
//            {
//                if (G.edges[i][j] < (G.edges[i][k] * G.edges[k][j]))
//                {
//                    G.edges[i][j] = G.edges[i][k] * G.edges[k][j];
//                }
//            }
//        }
//    }
//    
//    return ;
//}
//
//MGraph G;
//
//int main()
//{
//    int n, m;
//    string str, str_;
//    double r;
//    
//    int iCase = 0;
//    while (scanf("%d", &n), n)
//    {
//        iCase++;
//        G.N = n;
//        for (int i = 1; i <= n; i++)
//        {
//            cin >> str;
//            money[str] = i;
//        }
//        for (int i = 1; i <= n; i++)
//        {
//            for (int j = 1; j <= n; j++)
//            {
//                if (i == j)
//                {
//                    G.edges[i][j] = 1;
//                }
//                else
//                {
//                    G.edges[i][j] = 0;
//                }
//            }
//        }
//       
//        scanf("%d", &m);
//        while (m--)
//        {
//            cin >> str >> r >> str_;
//            G.edges[money[str]][money[str_]] = r;
//        }
//        
//        Floyd(G);
//        
//        bool flag = false;
//        for (int i = 1; i <= n; i++)
//        {
//            if (G.edges[i][i] > 1)
//            {
//                flag = true;
//                break;
//            }
//        }
//        if (flag)
//        {
//            printf("Case %d: Yes\n", iCase);
//        }
//        else
//        {
//            printf("Case %d: No\n", iCase);
//        }
//    }
//    
//    return 0;
//}

Two:

#include <cstdio>
#include <iostream>
#include <string>
#include <map>

using namespace std;

typedef double typec;

map<string, int> money;

/*
 *  Floyd算法,求从任意节点i到任意节点j的最短路径
 *  edges[][]:初始化为INF(edges[i][i]:初始化为0)
 */
const int MAXN = 33;

void Floyd(typec edges[][MAXN], int n)
{
    int i, j, k;

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

    return ;
}

double edges[MAXN][MAXN];

int main()
{
    int n, m;
    string str, str_;
    double r;

    int iCase = 0;
    while (scanf("%d", &n), n)
    {
        iCase++;

        for (int i = 1; i <= n; i++)
        {
            cin >> str;
            money[str] = i;
        }
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (i == j)
                {
                    edges[i][j] = 1;
                }
                else
                {
                    edges[i][j] = 0;
                }
            }
        }

        scanf("%d", &m);
        while (m--)
        {
            cin >> str >> r >> str_;
            edges[money[str]][money[str_]] = r;
        }

        Floyd(edges, n);

        bool flag = false;
        for (int i = 1; i <= n; i++)
        {
            if (edges[i][i] > 1)
            {
                flag = true;
                break;
            }
        }
        if (flag)
        {
            printf("Case %d: Yes\n", iCase);
        }
        else
        {
            printf("Case %d: No\n", iCase);
        }
    }

    return 0;
}

参考

《最短路》

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值