hunnu 11545小明的烦恼——找路径 (最大流)
来源:互联网 发布:java mvc设计模式闫宏 编辑:程序博客网 时间:2024/06/05 18:42
小明的烦恼——找路径 Time Limit: 2000ms, Special Time Limit:5000ms,Memory Limit:32768KBTotal submit users: 45, Accepted users:37Problem 11545 : No special judgementProblem description 小明真的是个很厉害的人,每当老师有什么事时,总是会找到小明,二小明也总能解决,所以老师决定给小明一个奖励,给他额外的假期。小明当然很高兴,因为小明终于可以如愿的出去旅游了。小明旅游的第一站到了美丽的长沙,到了长沙当然免不了要去参观古色古香的的湖南师范大学了,小明在师大校园里愉快的玩耍,不时瞅一眼从他身边经过的美女,也感叹这个校园古老建筑带给他的震撼。临近中午了,小明走到了理学院大门前,瞬间就被吸引了,于是就走了进去,在理学院的一个教室外面,小明看到有个带眼睛的男生在皱眉头,好像是被什么难题卡住了,小明的慈悲之心油然而生,于是就走了进去。于是题目就来了:
有N个城市,有些城市有道路相连,但这些道路中间并没有加油站(每个城市里面有加油站可以补给),现在有个工程师要找到T条不同的路径从1号城市到N号城市,两条路径是不同的当且仅当不经过相同的边,现在告诉你工程师的汽车的最大载油量C和经过每条道路所要消耗的油量,问你这个工程师能不能完成任务。
Input 由多组case:
每组case第一行有4个整数N,M,T,C,N<=200;C<=1000000;
然后有M行。每一行有3个整数,a,b,c,代表从a城市到b城市需要c的油量。c<=1000000;如果两个城市之间有多条边,则视为不同的边。
Output 对于每个case:
如果工程师能够完成任务,输出YES,不然输出NO。
Sample Input
有N个城市,有些城市有道路相连,但这些道路中间并没有加油站(每个城市里面有加油站可以补给),现在有个工程师要找到T条不同的路径从1号城市到N号城市,两条路径是不同的当且仅当不经过相同的边,现在告诉你工程师的汽车的最大载油量C和经过每条道路所要消耗的油量,问你这个工程师能不能完成任务。
Input 由多组case:
每组case第一行有4个整数N,M,T,C,N<=200;C<=1000000;
然后有M行。每一行有3个整数,a,b,c,代表从a城市到b城市需要c的油量。c<=1000000;如果两个城市之间有多条边,则视为不同的边。
Output 对于每个case:
如果工程师能够完成任务,输出YES,不然输出NO。
Sample Input
7 9 2 51 2 22 3 53 7 51 4 14 3 14 5 75 7 11 6 36 7 37 9 2 41 2 22 3 53 7 51 4 14 3 14 5 75 7 11 6 36 7 3Sample Output
YESNO
解题:假设每条可行边的流限最大为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\n"); else printf("NO\n"); }}
0 0
- hunnu 11545小明的烦恼——找路径 (最大流)
- hunnu--11545--小明的烦恼——找路径
- hunnu--11543--小明的烦恼——分糖果
- hunnu oj 11544 小明的烦恼——找字符串(字符串的最小表示法)
- hunnu11544:小明的烦恼——找字符串
- HUNNU 11567 Escaping(最大流)
- 小明的烦恼
- 小明的烦恼
- 小明的烦恼
- 小明的烦恼
- 小明的烦恼
- 小明的烦恼
- 小明的烦恼
- 小明的烦恼
- hunnu11543:小明的烦恼——分糖果
- NYOJ-453 小珂的烦恼【模拟||找规律】
- NYOJ - 小明的烦恼
- NYOJ223 小明的烦恼
- 第三方登录,授权,分享
- OpenCV学习笔记(五十四)——概述FaceRecognizer人脸识别类contrib
- 17.2 复制实施
- 深度优先搜索、广度优先搜索的实现
- 寻找和为定值的两个数
- hunnu 11545小明的烦恼——找路径 (最大流)
- Android contacts 数据库分析
- 林仕鼎:系统架构领域的一些学习材料
- 维护计划增强
- 第四题
- 欢迎使用CSDN-markdown编辑器
- DB2 数据库中import大数据量时提高效率
- 黑马程序员----用LinkedList模仿堆栈和队列原理
- 通知单增强