题目大意:给一张网络,问是否存在一条恰为C的流。若不存在,那是否存在一条弧,使得改动这条弧的容量后能恰有为C的流?

题目分析:先找出最大流,如果最大流不比C小,那么一定存在一条恰为C的流。否则,找出最小割集,然后枚举每一条弧改动其容量,看是否存在恰为C的流。

代码如下:

# include<iostream>
# include<cstdio>
# include<cmath>
# include<string>
# include<vector>
# include<list>
# include<set>
# include<map>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std; # define LL long long
# define REP(i,s,n) for(int i=s;i<n;++i)
# define CL(a,b) memset(a,b,sizeof(a))
# define CLL(a,b,n) fill(a,a+n,b) const double inf=1e30;
const int INF=1<<30;
const int maxn=10005; struct Edge
{
int fr,to;
LL cap,fw;
Edge(int _fr,int _to,LL _cap,LL _fw):fr(_fr),to(_to),cap(_cap),fw(_fw){}
bool operator <(const Edge &a) const{
if(fr==a.fr) return to<a.to;
return fr<a.fr;
}
};
vector<Edge>edges,tedges,ans;
vector<int>G[2*maxn];
vector<int>minCut;
int N,E,cur[105],vis[105],d[105];
LL C,Flow;
int s,t; void init()
{
Flow=0;
s=1,t=N;
edges.clear();
REP(i,0,N+1) G[i].clear();
} void addEdge(int u,int v,LL c)
{
edges.push_back(Edge(u,v,c,0));
edges.push_back(Edge(v,u,0,0));
int m=edges.size();
G[u].push_back(m-2);
G[v].push_back(m-1);
} bool BFS()
{
CL(vis,0);
queue<int>q;
vis[s]=1;
d[s]=0;
q.push(s);
while(!q.empty()){
int x=q.front();q.pop();
REP(i,0,G[x].size()){
Edge &e=edges[G[x][i]];
if(!vis[e.to]&&e.cap>e.fw){
vis[e.to]=1;
d[e.to]=d[x]+1;
q.push(e.to);
}
}
}
return vis[t];
} LL DFS(int x,LL a)
{
if(x==t||a==0) return a;
LL flow=0,f;
for(int &i=cur[x];i<G[x].size();++i){
Edge &e=edges[G[x][i]];
if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.fw)))>0){
e.fw+=f;
edges[G[x][i]^1].fw-=f;
flow+=f;
a-=f;
if(a==0) break;
}
}
return flow;
} bool Dinic()
{
while(BFS()){
CL(cur,0);
Flow+=DFS(s,INF);
if(Flow>=C) return true;
}
return false;
} void findCut()
{
minCut.clear();
for(int i=0;i<edges.size();i+=2){
Edge &e=edges[i];
if(vis[e.fr]&&!vis[e.to]) minCut.push_back(i);
}
} void toFind()
{
findCut();
ans.clear();
tedges.clear();
int len=edges.size();
REP(i,0,len) tedges.push_back(edges[i]);
LL f=Flow;
REP(i,0,minCut.size()){
edges[minCut[i]].cap+=C;
if(Dinic()) ans.push_back(edges[minCut[i]]);
Flow=f;
edges.clear();
REP(j,0,len) edges.push_back(tedges[j]);
}
} void solve(int cas)
{
printf("Case %d: ",cas);
if(C==0||Dinic()){
printf("possible\n");
}else{
toFind();
int len=ans.size();
if(len>0){
printf("possible option:");
sort(ans.begin(),ans.end());
REP(i,0,len) printf("(%d,%d)%c",ans[i].fr,ans[i].to,(i==len-1)?'\n':',');
}else
printf("not possible\n");
}
} void read()
{
int a,b;
LL c;
while(E--)
{
scanf("%d%d%lld",&a,&b,&c);
addEdge(a,b,c);
}
} int main()
{
int cas=0;
while(scanf("%d%d%lld",&N,&E,&C),N|E|C)
{
init();
read();
solve(++cas);
}
  return 0;
}

  

UVA-11248 Frequency Hopping (最大流+最小割)的更多相关文章

  1. Uvaoj 11248 Frequency Hopping(Dinic求最小割)

    题意:1到n节点(节点之间有一定的容量),需要流过C的流量,问是否可以?如果可以输出possible, 否则如果可以扩大任意一条边的容量 可以达到目的,那么输出possible option:接着输出 ...

  2. uva 11248 Frequency Hopping (最大流)

    uva 11248 Frequency Hopping 题目大意:给定一个有向网络,每条边均有一个容量. 问是否存在一个从点1到点N.流量为C的流.假设不存在,能否够恰好改动一条弧的容量,使得存在这种 ...

  3. UVA 11248 - Frequency Hopping(网络流量)

    UVA 11248 - Frequency Hopping 题目链接 题意:给定一个网络,如今须要从1到N运输流量C,问是否可能,假设可能输出可能,假设不可能,再问能否通过扩大一条边的容量使得可能,假 ...

  4. UVA 11248 Frequency Hopping

    Frequency Hopping Time Limit: 10000ms Memory Limit: 131072KB This problem will be judged on UVA. Ori ...

  5. UVa 11248 Frequency Hopping (网络流)

    题意:给定上一个网络,每个边有一个容量,问你能不能从 1 到 n,使得流量为 c,如果不能,那么是不是可以修改一条边,使得达到. 析:背景就是一个网络流,如果原图能跑出来,那么就不用了,就肯定能达到, ...

  6. 最大流-最小割 MAXFLOW-MINCUT ISAP

    简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...

  7. UVa11248 Frequency Hopping(最大流+最小割)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33206 [思路] 最大流最小割. 可以确定的是如果不可行需要修改的 ...

  8. 最大流&最小割 - 专题练习

    [例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...

  9. matlab练习程序(最大流/最小割)

    学习这个算法是为学习图像处理中的图割算法做准备的. 基本概念: 1.最大流是一个有向图. 2.一个流是最大流,当且仅当它的残余网络中不包括增广路径. 3.最小割就是网络中所有割中值最小的那个割,最小割 ...

  10. 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割

    Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...

随机推荐

  1. poj1952 BUY LOW, BUY LOWER【线性DP】【输出方案数】

    BUY LOW, BUY LOWER Time Limit: 1000MS   Memory Limit: 30000K Total Submissions:11148   Accepted: 392 ...

  2. 当url作为id时的删除

    API Documentation — Elasticsearch 6.3.1 documentation https://elasticsearch-py.readthedocs.io/en/mas ...

  3. Currency Exchange---poj1860 ( spfa, 回路,最长路)

    题目链接:http://poj.org/problem?id=1860 题解: 两种情况YES,一种是存在正权回路: 一种是求最长路后,实现了增值,也是YES: 用spfa来判断是否存在正权回路,其实 ...

  4. 评论抓取:Python爬取微信在APPStore上的评论内容及星级

    #完整程序如下: import requests import re def getHTMLText(url): try: r = requests.get(url) r.raise_for_stat ...

  5. HTTP的常见状态码

    一.1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态码. 100(继续) 请求者应当继续提出请求.服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101(切换协议) 请求者 ...

  6. PHP函数处理方法总结

    call_user_func_array (PHP 4 >= 4.0.4, PHP 5, PHP 7) call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的 ...

  7. [golang note] 工程组织

    golang项目目录结构 <golang_proj> ├─README                 ├─AUTHORS                 ├─<bin>    ...

  8. ruby中的win32ole使用

    ruby中的win32ole是一个标准库,使用的时候只要添加require 'win32ole'就行. 下面是一段模拟一个登陆的代码 require 'win32ole' ie = WIN32OLE. ...

  9. Java 和 Python 解析动态 key 的 JSON 数据

    一.概述 解析JSON过程中,什么情况都可能遇到.遇到特殊的情况,不会怎么办?肯定不是设计的问题,一定是你的姿势不对. 有这样一种JSON需要解析: { "b3444533f6544&quo ...

  10. SQL 根据条件取不同列中的值来排序

    1  有时候排序比较复杂,比如:领导对工资在1000到2000元之间的员工更感兴趣,于是要求工资在这个范围内的员工排在前面,以便优先查看 对于这种要求我们可以在查询中新生成一列,用多列排序的方法处理代 ...