zoukankan      html  css  js  c++  java
  • hunnu 11545小明的烦恼——找路径 (最大流)

    小明的烦恼——找路径 
    Time Limit: 2000ms, Special Time Limit:5000ms, Memory Limit:32768KB
    Total submit users: 45, Accepted users: 37
    Problem 11545 : No special judgement
    Problem description
      小明真的是个非常厉害的人,每当老师有什么事时,总是会找到小明,二小明也总能解决,所以老师决定给小明一个奖励,给他额外的假期。小明当然非常高兴。由于小明最终能够如愿的出去旅游了。小明旅游的第一站到了漂亮的长沙,到了长沙当然免不了要去參观古色古香的的湖南师范大学了。小明在师大校园里愉快的玩耍。不时瞅一眼从他身边经过的美女,也感叹这个校园古老建筑带给他的震撼。

    临近中午了。小明走到了理学院大门前,瞬间就被吸引了,于是就走了进去,在理学院的一个教室外面。小明看到有个带眼睛的男生在皱眉头,好像是被什么难题卡住了,小明的慈悲之心油然而生,于是就走了进去。

    于是题目就来了:
    有N个城市,有些城市有道路相连。但这些道路中间并没有加油站(每一个城市里面有加油站能够补给),如今有个project师要找到T条不同的路径从1号城市到N号城市,两条路径是不同的当且仅当不经过同样的边。如今告诉你project师的汽车的最大载油量C和经过每条道路所要消耗的油量。问你这个project师能不能完毕任务。

    Input
      由多组case:
    每组case第一行有4个整数N。M。T,C。N<=200;C<=1000000;
    然后有M行。每一行有3个整数,a,b,c,代表从a城市到b城市须要c的油量。c<=1000000;假设两个城市之间有多条边,则视为不同的边。
    Output
      对于每一个case:
    假设project师可以完毕任务,输出YES,不然输出NO。


    Sample Input
    7 9 2 5
    1 2 2
    2 3 5
    3 7 5
    1 4 1
    4 3 1
    4 5 7
    5 7 1
    1 6 3
    6 7 3
    7 9 2 4
    1 2 2
    2 3 5
    3 7 5
    1 4 1
    4 3 1
    4 5 7
    5 7 1
    1 6 3
    6 7 3
    Sample Output
    YES
    NO
    解题:如果每条可行边的流限最大为1,则依据网络流的性质:每一个点的 流进量==流出量,守恒。所以一条边仅仅能属于一条路。
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<iostream>
    using namespace std;
    const int N = 225;
    
    bool mapt[N][N];
    int pre[N],sNode,eNode,n;
    
    bool searchPath(){//找一条增广路
        queue<int>q;
        bool vist[N]={0};
        pre[sNode]=sNode; vist[sNode]=1;
        q.push(sNode);
        while(!q.empty()){
            int u=q.front(); q.pop();
            for(int v=2; v<=n; v++)
            if(mapt[u][v]&&vist[v]==0){
                vist[v]=1;
                pre[v]=u;
                if(v==eNode) return true;
                q.push(v);
            }
        }
        return false;
    }
    bool maxflow(int T){
        while(searchPath()){
            int u,v;
            T--;
            if(T<=0)return true;
            v=eNode;
            while(v!=sNode){
                u=pre[v];
                mapt[u][v]=0;
                mapt[v][u]=1;//能够回流
                v=u;
            }
        }
        return false;
    }
    int main(){
        int M,T,C,a,b,c;
        while(scanf("%d%d%d%d",&n,&M,&T,&C)>0){
            memset(mapt,false,sizeof(mapt));
            sNode=1; eNode=n;
            while(M--){
                scanf("%d%d%d",&a,&b,&c);
                if(c<=C) mapt[a][b]=1;//每条边的最大流限。
            }
            if(T==0||maxflow(T))
            printf("YES
    ");
            else printf("NO
    ");
        }
    }
    


  • 相关阅读:
    linux之 awk
    linux之 sed命令
    HBase源码分析之WAL
    oracle之 单实例监听修改端口
    oracle之 ORA-12557: TNS: 协议适配器不可加载
    oracle之 反向键索引
    oracle之 AWR固定基线
    oracle之 如何 dump logfile
    oracle 之 CLUSTER_INTERCONNECTS is not set to the recommended value
    oracle之 变更OS时间对数据库的影响
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7112690.html
Copyright © 2011-2022 走看看