首页 > 代码库 > hunnu 11545小明的烦恼——找路径 (最大流)
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 |
小明真的是个非常厉害的人,每当老师有什么事时,总是会找到小明,二小明也总能解决,所以老师决定给小明一个奖励,给他额外的假期。小明当然非常高兴。由于小明最终能够如愿的出去旅游了。小明旅游的第一站到了漂亮的长沙,到了长沙当然免不了要去參观古色古香的的湖南师范大学了。小明在师大校园里愉快的玩耍。不时瞅一眼从他身边经过的美女,也感叹这个校园古老建筑带给他的震撼。 临近中午了。小明走到了理学院大门前,瞬间就被吸引了,于是就走了进去,在理学院的一个教室外面。小明看到有个带眼睛的男生在皱眉头,好像是被什么难题卡住了,小明的慈悲之心油然而生,于是就走了进去。 于是题目就来了: |
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\n"); else printf("NO\n"); } } |
hunnu 11545小明的烦恼——找路径 (最大流)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。