• POJ 1860 Currency Exchange 最短路 难度:0


    http://poj.org/problem?id=1860

    #include <cstdio>
    //#include <queue>
    //#include <deque>
    #include <cstring>
    using namespace std;
    #define MAXM 202
    #define MAXN 101
    int n,m;
    int first[MAXN];
    int next[MAXM];
    int pto[MAXM];
    double earn[MAXM];
    int start;
    double d[MAXN];
    double cost[MAXM];
    bool vis[MAXM];
    void addedge(int from,int to,double fromcost,double fromearn,int index){
        next[index]=first[from];
        pto[index]=to;
        cost[index]=fromcost;
        earn[index]=fromearn;
        first[from]=index;
    }
    bool input(){
        bool fl=false;
        memset(first,-1,sizeof(first));
       double double1;
        scanf("%d %d %d %lf",&n,&m,&start,&double1);
        d[start]=double1;
        double fromc,toc,frome,toe;
        int from,to;
        for(int i=0;i<m;i++){
            scanf("%d %d %lf %lf %lf %lf",&from,&to,&frome,&fromc,&toe,&toc);
            addedge(from,to,fromc,frome,2*i);
            addedge(to,from,toc,toe,2*i+1);
            if(from==start&&frome>0.999999){
                fl=true;
            }
            else if(to==start&&toe>0.999999){
                fl=true;
            }
        }
        return fl;
    }
    int que[MAXM];
    int quehead;
    int quetail;
    void pushback(int inse){
        que[quetail]=inse;
        quetail=(quetail+1)%MAXM;
        vis[inse]=true;
    }
    void pushfront(int inse){
        quehead=(quehead-1+MAXM)%MAXM;
        que[quehead]=inse;
        vis[inse]=true;
    }
    int pop(){
        int ans=que[quehead];
        quehead=(quehead+1)%MAXM;
        vis[ans]=false;
        return ans;
    }
    bool find_loop(){
        if(!input())return false;
        pushback(start);
        while(quehead!=quetail){
            int from=pop();
            int p=first[from];
            while(p!=-1){
                int to=pto[p];
                double dtemp1;
                if((dtemp1=(d[from]-cost[p])*earn[p])>d[to]){
                    d[to]=dtemp1;
                    if(!vis[to]){
                        if(d[to]>d[que[quehead]])pushfront(to);
                        else pushback(to);
                    }
                    if(to==start){
                        return true;
                    }
                }
                p=next[p];
            }
        }
        return false;
    }
    int main(){
        if(find_loop()){
            printf("YES
    ");
        }
        else printf("NO
    ");
    }
    

      

  • 相关阅读:
    人月神话阅读笔记之二
    第二阶段:团队开发Fooks第三天
    第二阶段:团队开发Fooks第二天
    第二阶段:团队开发Fooks第一天
    第十三周进度总结
    人月神话阅读笔记之一
    第一阶段意见评论
    拓扑排序
    欧拉回路
    矩阵优化
  • 原文地址:https://www.cnblogs.com/xuesu/p/4754378.html
Copyright © 2020-2023  润新知