• POJ


    POJ - 2240 题目链接

    本来是一道非常简单的题,但是我wa了这么多


    首先我得说一下POJ了,不支持 #include<bits/stdc++.h>

    #define要加 #include<stdlib.h> 的头文件又长见识了。
    然后就是我自己的原因的,我在代码里面详细说明吧

    思路

    从例子中我们呢可以判断出,这是一道判断环的问题,这个专题之前也写过一道类似的题目,30的数据量,那就直接floyd吧

    代码

    Powered by CK
    #include<iostream>
    #include<cstdio>
    #include<stdlib.h>
    #include<algorithm>
    #include<string>
    #include<map>
    #include<cstring>
    #define esp 1e-8
    using namespace std;
    const int N = 110;
    double ans[N][N];
    int n, m;
    map<string, int> mp;//这里存的是对应的货币的数字,每种货币对应一个数字。
    void init() {//多组输入初始化很重要
        memset(ans, 0, sizeof ans);
        mp.clear();
    }
    bool Floyed() {
        for(int i = 1; i <= n; i++) ans[i][i] = max(ans[i][i], 1.0);//第二个坑,如果输入的时候可能会出现同种货币的交换,而且汇率大于1
        for(int k = 1; k <= n; k++)
            for(int i = 1; i <= n; i++) {
                for(int j = 1; j <= n; j++) {
                    if(ans[i][j] < ans[i][k] * ans[k][j])
                        ans[i][j] = ans[i][k] * ans[k][j];
                }
                    if(ans[i][i] > 1.0)   return true;
            }
        return false;
    }
    int main() {
        ios::sync_with_stdio(false);
        string x, y;
        double w;
        int cas = 1;
        while(cin >> n && n) {
            init();
            for(int i = 1; i <= n; i++) {
                cin >> x;
                mp[x] = i;
            }
            cin >> m;
            for(int i = 0; i < m; i++) {
                cin >> x >> w >> y;
                ans[mp[x]][mp[y]] = max(w, ans[mp[x]][mp[y]]);//第一个坑,邻阶矩阵存图,判断最优边权很重要。
            }
            if(Floyed())cout << "Case " << cas++ << ": Yes" <<endl;
    		else cout << "Case " << cas++ << ": No" << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    大道至简观后感
    冲刺第二天
    梦断代码阅读笔记 02
    冲刺第一天
    第十周学习进度
    个人冲刺第一阶段个人任务--界面
    软工第二周个人作业
    软件工程开课博客(自我介绍)
    梦断代码阅读笔记01
    第二周学习进度报告
  • 原文地址:https://www.cnblogs.com/lifehappy/p/12623072.html
Copyright © 2020-2023  润新知