Uva-11248-Frequency Hopping
来源:互联网 发布:网络无武侠小说 编辑:程序博客网 时间:2024/06/08 05:17
大白书上面网络流的一道题,第一次接触这种保存残余网络流,然后直接在此基础之上进行更新,不过这个题我写的时候需要注意的地方就是最后找最小割后,进行不断枚举一个割边更新的时候一定要是原来的输入的边,而不是我们添加的反向边,在这里WA了1个多小时。
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<algorithm>using namespace std;const int inf=2000000100;const int maxn=200;const int maxm=1e5;int n,m,c,st,des,cnt,e,head[maxn],nxt[maxm],pnt[maxm],from[maxm],flow[maxm],cap[maxm],level[maxn];bool vis[maxn];queue<int> q;struct Node{ int from; int to; Node(){}; Node(int sfrom,int sto) { from=sfrom; to=sto; } bool operator < (const Node &a)const { if(from==a.from) return to<a.to; return from<a.from; }}ans[maxm];void AddEdge(int u,int v,int f){ pnt[e]=v;from[e]=u;nxt[e]=head[u];cap[e]=f;head[u]=e++; pnt[e]=u;from[e]=v;nxt[e]=head[v];cap[e]=0;head[v]=e++;}bool BFS(){ memset(level,0,sizeof(level)); level[st]=1; q.push(st); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=nxt[i]) if(cap[i]&&!level[pnt[i]]) { level[pnt[i]]=level[u]+1; q.push(pnt[i]); } } return level[des];}bool bfs(){ memset(level,0,sizeof(level)); level[st]=1; q.push(st); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=nxt[i]) if(cap[i]>flow[i]&&!level[pnt[i]]) { level[pnt[i]]=level[u]+1; q.push(pnt[i]); } } return level[des];}int DFS(int u,int maxf){ if(u==des||!maxf) return maxf; for(int i=head[u],t;i!=-1;i=nxt[i]) if(level[pnt[i]]==level[u]+1&&(t=DFS(pnt[i],min(maxf,cap[i])))) { cap[i]-=t; cap[i^1]+=t; return t; } return level[u]=0;}int dfs(int u,int maxf){ if(u==des||!maxf) return maxf; for(int i=head[u],t;i!=-1;i=nxt[i]) if(level[pnt[i]]==level[u]+1&&(t=dfs(pnt[i],min(maxf,cap[i]-flow[i])))) { flow[i]+=t; flow[i^1]-=t; return t; } return level[u]=0;}int maxflow(){ int ans=0; while(BFS()) while(1) { int val=DFS(st,inf); if(!val) break; ans+=val; } return ans;}int maxflow2(int flow){ int ans=0; while(bfs()) while(1) { int val=dfs(st,inf); if(!val) break; ans+=val; if(flow+ans>=c) return ans; } return ans;}void GetMinCut(int u){ vis[u]=1; for(int i=head[u];i!=-1;i=nxt[i]) if(!vis[pnt[i]]&&cap[i]) GetMinCut(pnt[i]);}void ClearFlow(){ memset(flow,0,sizeof(flow));}void Solve(){ int flow=maxflow(); if(flow>=c) { printf("possible\n"); return; } cnt=0; GetMinCut(st); for(int i=0;i<e;i+=2) if(vis[from[i]]&&!vis[pnt[i]]) { // printf("Update %d %d %d\n",from[i],pnt[i],cap[i]); cap[i]=c; ClearFlow(); int val=maxflow2(flow); if(val+flow>=c) ans[cnt++]=Node(from[i],pnt[i]); cap[i]=0; } if(!cnt) { printf("not possible\n"); return; } sort(ans,ans+cnt); printf("possible option:"); printf("(%d,%d)",ans[0].from,ans[0].to); for(int i=1;i<cnt;i++) printf(",(%d,%d)",ans[i].from,ans[i].to); printf("\n");}int main(){ int cas=1; while(scanf("%d%d%d",&n,&m,&c)&&(n+m+c)) { memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); e=0; st=1,des=n; for(int i=0;i<m;i++) { int u,v,f; scanf("%d%d%d",&u,&v,&f); AddEdge(u,v,f); } printf("Case %d: ",cas++); if(n==1) { printf("possible\n"); continue; } Solve(); } return 0;}
0 0
- Uva 11248 Frequency Hopping
- UVA 11248 Frequency Hopping
- UVA 11248Frequency Hopping
- Uva 11248 Frequency Hopping
- Uva-11248-Frequency Hopping
- UVA 11248 - Frequency Hopping
- UVA 11248 Frequency Hopping
- UVa 11248 - Frequency Hopping 最大流
- UVA 11248 - Frequency Hopping(网络流)
- 【最小割】 UVA 11248 Frequency Hopping
- UVA 11248 Frequency Hopping 最小割
- uva 11248 Frequency Hopping (最大流)
- UVA 11248 Frequency Hopping (最大流)
- Uva 11248 Frequency Hopping(最大流)
- Frequency Hopping UVA
- UVa 11248 - Frequency Hopping - 最大流 - 最小割
- UVA 11248 Frequency Hopping(最大流、最小割)
- UVA 11248 Frequency Hopping (最大流+最小割)
- Pdsh安装 (Parallel Distributed Shell)
- Android FragmentManage FragmentTransaction介绍
- linux 创建定时器运行sh命令
- Linux kernel Makefile
- 从零开始写PHP(零)
- Uva-11248-Frequency Hopping
- 虚函数与纯虚函数的作用和区别
- Android2.3使用BitmapRegionDecoder获取指定区域的图片
- static关键字的作用
- 由malloc等函数想到的一些问题
- C语言相关Warning。。。解决方案
- Validating rows when using LINQ to SQL
- php处理linux配置文件问题
- DWR入门实例(二)