ZOJ-2587-Unique Attack(最小割的唯一性)
题意:
求无向图最小割是否唯一
分析:
1、我们先对原图求一次最大流
2、对残留网络,我们从S开始,找到所有所有S能到达的点;再从T开始,找出所有能到达T的点。
3、判断原网络中是否还有没有访问到的点,如果没有,则唯一,否者,不唯一!
- // File Name: ACM/ZOJ/2587.cpp
- // Author: Zlbing
- // Created Time: 2013年08月16日 星期五 13时38分56秒
- #include<iostream>
- #include<string>
- #include<algorithm>
- #include<cstdlib>
- #include<cstdio>
- #include<set>
- #include<map>
- #include<vector>
- #include<cstring>
- #include<stack>
- #include<cmath>
- #include<queue>
- using namespace std;
- #define CL(x,v); memset(x,v,sizeof(x));
- #define INF 0x3f3f3f3f
- #define LL long long
- #define REP(i,r,n) for(int i=r;i<=n;i++)
- #define RREP(i,n,r) for(int i=n;i>=r;i--)
- const int MAXN=;
- struct Edge{
- int from,to,cap,flow;
- };
- bool cmp(const Edge& a,const Edge& b){
- return a.from < b.from || (a.from == b.from && a.to < b.to);
- }
- struct Dinic{
- int n,m,s,t;
- vector<Edge> edges;
- vector<int> G[MAXN];
- bool vis[MAXN];
- int d[MAXN];
- int cur[MAXN];
- void init(int n){
- this->n=n;
- for(int i=;i<=n;i++)G[i].clear();
- edges.clear();
- }
- void AddEdge(int from,int to,int cap){
- edges.push_back((Edge){from,to,cap,});
- edges.push_back((Edge){to,from,cap,});//当是无向图时,反向边容量也是cap,有向边时,反向边容量是0
- m=edges.size();
- G[from].push_back(m-);
- G[to].push_back(m-);
- }
- bool BFS(){
- CL(vis,);
- queue<int> Q;
- Q.push(s);
- d[s]=;
- vis[s]=;
- while(!Q.empty()){
- int x=Q.front();
- Q.pop();
- for(int i=;i<G[x].size();i++){
- Edge& e=edges[G[x][i]];
- if(!vis[e.to]&&e.cap>e.flow){
- vis[e.to]=;
- d[e.to]=d[x]+;
- Q.push(e.to);
- }
- }
- }
- return vis[t];
- }
- int DFS(int x,int a){
- if(x==t||a==)return a;
- int flow=,f;
- for(int& i=cur[x];i<G[x].size();i++){
- Edge& e=edges[G[x][i]];
- if(d[x]+==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>){
- e.flow+=f;
- edges[G[x][i]^].flow-=f;
- flow+=f;
- a-=f;
- if(a==)break;
- }
- }
- return flow;
- }
- //当所求流量大于need时就退出,降低时间
- int Maxflow(int s,int t,int need){
- this->s=s;this->t=t;
- int flow=;
- while(BFS()){
- CL(cur,);
- flow+=DFS(s,INF);
- if(flow>need)return flow;
- }
- return flow;
- }
- //最小割割边
- vector<int> Mincut(){
- BFS();
- vector<int> ans;
- for(int i=;i<edges.size();i++){
- Edge& e=edges[i];
- if(vis[e.from]&&!vis[e.to]&&e.cap>)ans.push_back(i);
- }
- return ans;
- }
- void Reduce(){
- for(int i = ; i < edges.size(); i++) edges[i].cap -= edges[i].flow;
- }
- void ClearFlow(){
- for(int i = ; i < edges.size(); i++) edges[i].flow = ;
- }
- void dfs1(int u)
- {
- vis_dfs[u]=;
- a++;
- for(int i=;i<(int)G[u].size();i++)
- {
- Edge e=edges[G[u][i]];
- if(e.cap>e.flow&&!vis_dfs[e.to])
- dfs1(e.to);
- }
- }
- void dfs2(int u)
- {
- vis_dfs[u]=;
- b++;
- for(int i=;i<(int)G[u].size();i++)
- {
- Edge e=edges[G[u][i]^];
- if(e.cap>e.flow&&!vis_dfs[e.from])
- dfs2(e.from);
- }
- }
- bool solve()
- {
- CL(vis_dfs,);
- a=;
- b=;
- dfs1(s);
- dfs2(t);
- if(a+b==n)return true;
- else return false;
- }
- int a,b;
- int vis_dfs[MAXN];
- };
- Dinic solver;
- int main()
- {
- int n,m,A,B;
- while(~scanf("%d%d%d%d",&n,&m,&A,&B))
- {
- if(n==)break;
- solver.init(n);
- int a,b,c;
- REP(i,,m)
- {
- scanf("%d%d%d",&a,&b,&c);
- solver.AddEdge(a,b,c);
- }
- solver.Maxflow(A,B,INF);
- bool ans=solver.solve();
- if(ans)puts("UNIQUE");
- else puts("AMBIGUOUS");
- }
- return ;
- }
ZOJ-2587-Unique Attack(最小割的唯一性)的更多相关文章
- ZOJ 2587 Unique Attack (最小割唯一性)
题意 判断一个无向图的割是否唯一 思路 错误思路:一开始想的是判断割边是否都是关键割边,那既然割边两端点能连通S.T点的边是关键边,那么只要遇到有某个边两端点不连通S or T则这条边就不是关键割边( ...
- zoj 2587 Unique Attack 最小割判定
题目链接 让你判断最小割是否唯一. 判断方法是, 先求一遍最大流, 然后从源点dfs一次, 搜索未饱和边的数目. 从汇点dfs一次, 同样也是搜索未饱和边的数目, 看总和是否等于n. 如果等于n那么唯 ...
- ZOJ 2587 Unique Attack(最小割唯一性判断)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2587 题意:判断最小割是否唯一. 思路: 最小割唯一性的判断是先跑一遍最大 ...
- ZOJ - 2587 Unique Attack (判断最小割是否唯一)
题意:判断最小割是否唯一. 分析:跑出最大流后,在残余网上从源点和汇点分别dfs一次,对访问的点都打上标记. 若还有点没有被访问到,说明最小割不唯一. https://www.cnblogs.com/ ...
- zoj 2587 Unique Attack【最小割】
拆点拆魔怔了 直接按照原图建就行,这里有个小技巧就是双向边的话不用按着板子建(u,v,c)(v,u,0)(v,u,c)(u,v,0),直接建(u,v,c)(v,u,c)会快十倍!800ms->8 ...
- zoj 2587 判断最小割的唯一性
算法: 先求出残量网络,计算出从src能够到的点集A,再求出能够到dst的点集B,如果所有点都被访问到了,那么割就是唯一的,即(A,B),否则(A,V-A)和(V-B,B)都是最小割. (注意因为割的 ...
- BZOJ 1797 最小割(最小割割边唯一性判定)
问题一:是否存在一个最小代价路径切断方案,其中该道路被切断? 问题二:是否对任何一个最小代价路径切断方案,都有该道路被切断? 现在请你回答这两个问题. 最小割唯一性判定 jcvb: 在残余网络上跑ta ...
- ZOJ 2676 Network Wars ★(最小割算法介绍 && 01分数规划)
[题意]给出一个带权无向图,求割集,且割集的平均边权最小. [分析] 先尝试着用更一般的形式重新叙述本问题.设向量w表示边的权值,令向量c=(1, 1, 1, --, 1)表示选边的代价,于是原问题等 ...
- ZOJ 3792 Romantic Value 最小割(最小费用下最小边数)
求最小割及最小花费 把边权c = c*10000+1 然后跑一个最小割,则flow / 10000就是费用 flow%10000就是边数. 且是边数最少的情况.. #include<stdio. ...
随机推荐
- [iOS 开发] app无法访问本地相册,且不显示在设置 -隐私 - 照片中
近几天在使用iOS8的Photos Framework访问本地相册时,app即不会弹出是否允许访问提示框,也无法显示在iPhone的设置-隐私-照片的访问列表中,代码如下: PHAuthorizati ...
- Android开发报错系列(一),java.lang.NullPointerException,at android.widget.ListView.setupChild
问题描述:运行代码是报空指针错误,java.lang.NullPointerException,at Android.widget.ListView.setupChild 问题定位:listview控 ...
- Python之路【第十四篇】:AngularJS --暂无内容-待更新
Python之路[第十四篇]:AngularJS --暂无内容-待更新
- maven 依赖冲突的问题
如果原始系统的jarA依赖jarB1.0 而新引入的jarC依赖jarB2.0 导致系统启动报错,提示冲突,这时为了保证原始系统的稳定性, 在pom.xml文件中引入jarC时,需要exclude掉j ...
- apache commons io包基本功能
1. http://jackyrong.iteye.com/blog/2153812 2. http://www.javacodegeeks.com/2014/10/apache-commons-io ...
- openURL的使用方法
openURL的使用方法 openURL的使用方法: view plaincopy to clipboardprint? [[UIApplication sharedApplication] open ...
- UITableViewCell 添加长按手势
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self actio ...
- .net版ckeditor配置水印功能(转)
本文简单讲解ckfinder控件给上图片加水印效果. 1.将ckfinder/plugins/watermark/bin/Debug目录下的CKFinder_Watermark.dll和CKFinde ...
- C# 多线程、结构体
struct IpAndPort { public string Ip; public int Port; } private void Form1_Load(object sender, Event ...
- jQuery实现公告文字左右滚动的代码。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...