zoukankan      html  css  js  c++  java
  • POJ

    https://vjudge.net/problem/POJ-2240

    题意

    已知n种货币,以及m种货币汇率及方式,问能否通过货币转换,使得财富增加。

    分析

    Bellman-Ford判断正环,注意初始化时置为0。

    #include<cstdio>  
    #include<cstring>  
    #include<string>  
    #include<algorithm>  
    #include<iostream>  
    #include<vector>  
    #include<map>  
      
    using namespace std;  
    int n,m;  
    double dist[40];    //注意类型为 double  
    struct edge //边的结构体,st为起点,ed为终点,rt为汇率  
    {  
        int st,ed;  
        double rt;  
        edge(int sst,int eed,double rtt) : st(sst),ed(eed),rt(rtt) {}  
        edge() {}  
    };  
      
    vector<edge> G;  
    map<string ,int> mp;  
      
    bool Bellman_ford(int v)  
    {  
        memset(dist,0,sizeof(dist)); 
        dist[v] = 1;  
        for(int j = 1;j < n;j++) {  // n - 1 次松弛操作  
            for(int i = 0;i < G.size();i++) {  
                int p1 = G[i].st,p2 = G[i].ed;  
                if(dist[p2] < dist[p1] * G[i].rt) {
                    dist[p2] = dist[p1] * G[i].rt;  
                }  
            }  
        }  
        for(int i = 0;i < G.size();i++){  
            int p1 = G[i].st,p2 = G[i].ed;  
            if(dist[p2] < dist[p1] * G[i].rt) { //第 n 次松弛可以得到更优解,则存在环  
                return true;      
            }  
        }  
        return false;  
    }  
      
    int main()  
    {  
        int cas = 1;  
        string s,ss;  
        while(~scanf("%d",&n) &&n) {  
            for(int i = 0;i < n;i++) {  
                cin >> s;  
                mp[s] = i; //货币名 s 的顶点编号 为 i  
            }  
            cin >> m;  
            string beg,ends;  
            double r;  
            G.clear();  
            for(int i = 0;i < m;i++) {  
                cin >> beg >> r >> ends;    //边的信息读取  
                G.push_back(edge (mp[beg] ,mp[ends] ,r) );  
            }  
            printf("Case %d: ",cas++);  
            for(int i = 0;i < n;i++) { //枚举所有开始的起点  
                if(Bellman_ford(i)) {   //存在环  
                    cout << "Yes" << endl;  
                    //printf("bellman %d
    ",i);  
                    break;  
                }  
                else if(i == n - 1)  
                    cout << "No" <<endl;  
            }  
        }  
        return 0;  
    } 
  • 相关阅读:
    通过 Ansible role 安装 Jenkins Server
    常见 Bash 内置变量介绍
    Ansible 简介
    为容器化的 Go 程序搭建 CI
    Bash Shebang 小结
    Docker Compose 引用环境变量
    Docker Compose 之进阶篇
    Docker Compose 原理
    WEB程序调用客户端程序
    读书笔记2014第5本:《乔纳森传》
  • 原文地址:https://www.cnblogs.com/fht-litost/p/9207034.html
Copyright © 2011-2022 走看看