UVA-11248 Frequency Hopping (最大流+最小割)
题目大意:给一张网络,问是否存在一条恰为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 (最大流+最小割)的更多相关文章
- Uvaoj 11248 Frequency Hopping(Dinic求最小割)
题意:1到n节点(节点之间有一定的容量),需要流过C的流量,问是否可以?如果可以输出possible, 否则如果可以扩大任意一条边的容量 可以达到目的,那么输出possible option:接着输出 ...
- uva 11248 Frequency Hopping (最大流)
uva 11248 Frequency Hopping 题目大意:给定一个有向网络,每条边均有一个容量. 问是否存在一个从点1到点N.流量为C的流.假设不存在,能否够恰好改动一条弧的容量,使得存在这种 ...
- UVA 11248 - Frequency Hopping(网络流量)
UVA 11248 - Frequency Hopping 题目链接 题意:给定一个网络,如今须要从1到N运输流量C,问是否可能,假设可能输出可能,假设不可能,再问能否通过扩大一条边的容量使得可能,假 ...
- UVA 11248 Frequency Hopping
Frequency Hopping Time Limit: 10000ms Memory Limit: 131072KB This problem will be judged on UVA. Ori ...
- UVa 11248 Frequency Hopping (网络流)
题意:给定上一个网络,每个边有一个容量,问你能不能从 1 到 n,使得流量为 c,如果不能,那么是不是可以修改一条边,使得达到. 析:背景就是一个网络流,如果原图能跑出来,那么就不用了,就肯定能达到, ...
- 最大流-最小割 MAXFLOW-MINCUT ISAP
简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...
- UVa11248 Frequency Hopping(最大流+最小割)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33206 [思路] 最大流最小割. 可以确定的是如果不可行需要修改的 ...
- 最大流&最小割 - 专题练习
[例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...
- matlab练习程序(最大流/最小割)
学习这个算法是为学习图像处理中的图割算法做准备的. 基本概念: 1.最大流是一个有向图. 2.一个流是最大流,当且仅当它的残余网络中不包括增广路径. 3.最小割就是网络中所有割中值最小的那个割,最小割 ...
- 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割
Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...
随机推荐
- jenkins之配置git认证方式
在使用jenkins构建时候需要从git下拉代码,需要配置认证方式 http拉取代码 配置用户名和密码认证 添加认证 设置用户名和密码 git认证 设置私钥认证
- poj3345 Bribing FIPA【树形DP】【背包】
Bribing FIPA Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5910 Accepted: 1850 Desc ...
- 【asm】64位编译32位汇编需要注意的
汇编语言在32位和64位下有区别 32位的汇编在代码前增加.code32 as可以通过--32指定生成32位汇编 在64位系统下ld链接生成32位程序: ld: i386 archi ...
- 云备份厂商Rubrik再获2.61亿美元融资,估值高达33亿美元 转自中国存储网
数据管理初创公司Rubrik在Bain Capital Ventures领导的最新一轮融资中筹集了2.61亿美元,估值为33亿美元. 现有的利益相关者 - Lightspeed Venture Par ...
- Unity-DLL反编译学习
本文由博主(SunboyL)原创,转载请注明出处:http://www.cnblogs.com/xsln/p/DLL_DeCompilation.html 在Unity实际开发过程中, ...
- IntelliJ IDEA 、PyCharm、WebStorm、PhpStorm等JetBrains公司软件 激活的License Server本地搭建教程
一.背景 IntelliJ IDEA是JetBrains公司的一款IDE,主要用于java开发,可以编写Java.Groovy.Kotlin.Scala等语言,也可以直接做Android开发. 同系列 ...
- mysql 数据操作 单表查询 group by 聚合函数
强调: 如果我们用unique的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义 多条记录之间的某个字段值相同,该字段通常用来作为分组的依据 如果按照每个字段都是唯一的进行分组,意味着按照这 ...
- React 教程
React 入门实例教程 http://www.ruanyifeng.com/blog/2015/03/react.html React 测试入门教程http://www.ruanyifeng.com ...
- Web Services 平台元素SOAP、WSDL 、UDDI
Web Services 拥有三种基本的元素:SOAP.WSDL 以及 UDDI. 什么是 SOAP? SOAP 是一种使应用程序有能力通过 HTTP 交换信息的基于 XML 的简易协议.或者可以更简 ...
- hashset和treeset的区别
hashset 和 treeset的区别 hashset 和 treeset的区别 1.TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值. 2.HashSet ...