1 条题解

  • 0
    @ 2025-5-22 10:28:41

    如果从S到S存在一条正回路,那就说明,本金可以无限增加,即输出yes,所以这是一道求最长路径的题目,我们采用spfa算法计算是否存在正环即可。对于图,每个节点就是一种currency,我采用的是邻接链表的方式存储边,这是因为,对于A->B这条边有很多种,即这个图存在重边。

    #include<iostream>
    #include<vector>
    #include<queue>
    #include<list>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define double float
    struct edge
    {
        int from;
        int to;
        double rate;
        double commission;
        edge(int f,int t,double r,double c)
        {
            from=f;
            to=t;
            rate=r;
            commission=c;
        }
    };
    list<edge> EdgeList[105];
    double Cash[105];
    int size_cur;
    int size_poi;
    int source;
    double quantity;
    
    bool spfa()
    {
        int inQ[105];
        int num_change[105];
        memset(inQ,0,sizeof (inQ));
        memset(num_change,0,sizeof(num_change));
        queue<int> Q;
        Q.push(source);
        inQ[source]=1;
        while(!Q.empty())
        {
            int v=Q.front();
            Q.pop();
            inQ[v]=0;
            for(list<edge>::iterator i=EdgeList[v].begin();i!=EdgeList[v].end();i++)
            {
                edge e=*i;
                if(Cash[e.to]<(Cash[e.from]-e.commission)*e.rate)
                {
                    Cash[e.to]=(Cash[e.from]-e.commission)*e.rate;
                    if(inQ[e.to]==0)
                    {
                        Q.push(e.to);
                        inQ[e.to]=1;
                        num_change[e.to]++;
                        if(num_change[e.to]>=size_cur)
                            return true;
                    }
                }
            }
        }
        return false;
        
    }
    
    int main()
    {
        memset(Cash,0,sizeof(Cash));
        cin>>size_cur>>size_poi>>source>>quantity;
        Cash[source]=quantity;
        for(int i=0;i<size_poi;i++)
        {
            int A,B;
            double r_ab,c_ab,r_ba,c_ba;
            cin>>A>>B>>r_ab>>c_ab>>r_ba>>c_ba;
            edge temp(A,B,r_ab,c_ab);
            EdgeList[A].push_back(temp);
            edge temp2(B,A,r_ba,c_ba);
            EdgeList[B].push_back(temp2);
        }
        cout<< (spfa()?"YES":"NO")<<endl;
        return 0;
    }
    
    
    • 1

    信息

    ID
    861
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者