zoukankan      html  css  js  c++  java
  • Billman_ford货币升值——正权回路

    22401860那个题目很像啊

    都是问货币能不能增多,钻社会制度得空子啊哈哈

    唯一不同得是你的起点是任意一个点,这个比较麻烦了,多了一层循环嘞

    处理货币名可以用map分配id

    然后就是老套的Billman_ford算法了

    #include <iostream>
    #include <map>
    #include <vector>
    #include <string.h>
    #include <cstdio>
    #include <string>
    using namespace std;
    const int maxn = 40;
    map<string,int> id;
    double dis[maxn];
    struct node{
        int from,to;
        double v;
        node(int f,int t,double va):from(f),to(t),v(va){}
        node(){}
    };
    

     这次联系了Stl中得容器,熟悉熟悉

    int main()
    {
        int n,m;
        string s,a,b;
        double v;
        int cas = 1;
        while(~scanf("%d",&n),n)
        {
            id.clear();
            edge.clear();
            for(int i = 1;i <= n;i++)
            {
                cin>>s;
                id[s] = i;
            }
            scanf("%d",&m);
            while(m--)
            {
                cin>>a;
                scanf("%lf",&v);
                cin>>b;
                edge.push_back(node(id[a],id[b],v));
            }
            printf("Case %d: ",cas++);
            for(int i = 1;i <= n;i++)
            {
                if(blm(i,n))
                {
                    printf("Yes
    ");
                    break;
                }
                else if(i == n)printf("No
    ");
            }
        }
        return 0;
    }
    
    vector<node> edge;
    bool blm(int s,int n)
    {
        for(int i = 1;i <= n;i++)dis[i] = 0;
        dis[s] = 1.0;
        for(int i = 1;i < n;i++)
        {
            for(int j = 0;j < edge.size();j++)
            {
                int from = edge[j].from;
                int to = edge[j].to;
                double v = edge[j].v;
                //cout<<from<<" "<<to<<" "<<v<<endl;
                dis[to] = max(dis[to],dis[from] * v);
            }
            //cout<<"cs"<<endl;
        }
        for(int i = 0;i < edge.size();i++)
        {
            int from = edge[i].from;
            int to = edge[i].to;
            double v = edge[i].v;
            if(dis[to] < dis[from] * v)return true;
        }
        return false;
    }
    
  • 相关阅读:
    stack 栈
    链表
    2018.09.08 DL24 Day1 总结
    10.07 WZZX Day2总结
    10.06 WZZX Day1总结
    Joseph问题 (线段树)
    [POI2006]TET-Tetris 3D
    10.05FZSZ Day2模拟总结
    Tarjan求LCA
    数据结构
  • 原文地址:https://www.cnblogs.com/DF-yimeng/p/8525453.html
Copyright © 2011-2022 走看看