ACM/ICPC 之 Dinic+枚举最小割点集(可做模板)(POJ1815)
最小割的好题,可用作模板。
//Dinic+枚举字典序最小的最小割点集
//Time:1032Ms Memory:1492K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std; #define MAXN 205
#define INF 0x3f3f3f3f int N, S, T;
int s,t;
int sres[2*MAXN][2*MAXN]; //source-res
int res[2*MAXN][2*MAXN];
int d[2*MAXN];
int cut[MAXN]; //最小割点集
bool v[2*MAXN]; bool bfs()
{
memset(d, -1, sizeof(d));
queue<int> q;
q.push(s); d[s] = 0;
while(!q.empty() && d[t] == -1){
int cur = q.front(); q.pop();
for(int i = 1; i <= t; i++)
{
if(d[i] == -1 && res[cur][i])
{
d[i] = d[cur] + 1;
q.push(i);
}
}
}
return d[t] != -1;
} int dfs(int x, int sum)
{
if(x == t || sum == 0) return sum;
int src = sum;
for(int i = 1; i <= t; i++)
{
if(d[i] == d[x] + 1 && res[x][i])
{
int tmp = dfs(i, min(sum, res[x][i]));
res[x][i] -= tmp;
res[i][x] += tmp;
sum -= tmp;
}
}
return src - sum;
} int Dinic()
{
memcpy(res, sres, sizeof(sres));
int maxFlow = 0;
while(bfs())
maxFlow += dfs(s,INF);
return maxFlow;
} int main()
{
//freopen("in.txt", "r", stdin); while(~scanf("%d%d%d", &N,&S,&T))
{
memset(sres, 0 ,sizeof(sres));
s = 0; t = 2*N+1;
sres[0][S] = sres[T+N][t] = INF;
for(int i = 1; i <= N; i++)
{
sres[i][i + N] = 1;
for(int j = 1; j <= N; j++)
{
int num;
scanf("%d", &num);
if(num && i != j) sres[i+N][j] = INF;
}
}
sres[S][S+N] = sres[T][T+N] = INF;
int ans = Dinic();
if(ans == INF){ //不可分开
printf("NO ANSWER!\n");
continue;
}
else {
printf("%d\n", ans);
if(ans == 0) continue; //已经分开
} //枚举最小割点集
int len = 0, tmp = ans;
for(int i = 1; i <= N && tmp; i++)
{
if(i == S || i == T) continue;
if(res[i][i+N]) continue;
sres[i][i+N] = 0;
int k = Dinic();
if(k != tmp){
tmp = k;
cut[len++] = i;
}
else sres[i][i+N] = 1;
}
for(int i = 0; i < ans - 1; i++)
printf("%d ", cut[i]);
printf("%d\n", cut[ans-1]);
} return 0;
}
ACM/ICPC 之 Dinic+枚举最小割点集(可做模板)(POJ1815)的更多相关文章
- hdu 4289 网络流拆点,类似最小割(可做模板)邻接矩阵实现
Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- ACM/ICPC 之 Dinic算法(POJ2112)
Optimal Milking //二分枚举最大距离的最小值+Floyd找到最短路+Dinic算法 //参考图论算法书,并对BFS构建层次网络算法进行改进 //Time:157Ms Memory:65 ...
- ACM/ICPC 之 机器调度-匈牙利算法解最小点覆盖集(DFS)(POJ1325)
//匈牙利算法-DFS //求最小点覆盖集 == 求最大匹配 //Time:0Ms Memory:208K #include<iostream> #include<cstring&g ...
- [C++]最小生成元 (Digit Generator, ACM/ICPC Seoul 2005, UVa1583)
Question 例题3-5 最小生成元 (Digit Generator, ACM/ICPC Seoul 2005, UVa1583) 如果x+x的各个数字之和得到y,就是说x是y的生成元.给出n( ...
- BZOJ 1050 旅行comf(枚举最小边-并查集)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1050 题意:给出一个带权图.求一条s到t的路径使得这条路径上最大最小边的比值最小? 思路 ...
- HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )
http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others) Memo ...
- ACM ICPC Kharagpur Regional 2017
ACM ICPC Kharagpur Regional 2017 A - Science Fair 题目描述:给定一个有\(n\)个点,\(m\)条无向边的图,其中某两个点记为\(S, T\),另外标 ...
- hduoj 4712 Hamming Distance 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...
随机推荐
- jquery获取url参数及url加参数的方法
转--http://www.jb51.net/article/73896.htm <script src="js/jquery-1.7.2.min.js" type=&quo ...
- 未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序。解决办法
在64位服务器系统上,默认不支持Microsoft.Jet.OLEDB.4.0的驱动程序,系统默认会提示未在本地计算机上注册"Microsoft.Jet.OLEDB.4.0"的错误 ...
- Appium简单测试用例
工程目录如下: 封装初始化androiddriver 方法 import org.openqa.selenium.remote.DesiredCapabilities; import java.io. ...
- 【转】JAVA自学之路
JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向 ...
- Java相关书籍分享
Java核心技术(卷1):基础知识(原书第9版) [Core Java Volume I-Fundamentals (Ninth Edition)].pdf Java核心技术(卷2):高级特性(原书第 ...
- javascript中针对float的ceil及floor
function floorFloat(num, precision) { return +(Math.floor(+(num + 'e' + (precision))) + 'e' + -(prec ...
- Mui.ajax请求服务器正确返回json数据格式
ajax: mui.ajax('http://server-name/login.php',{ data:{ username:'username', password:'password' }, d ...
- java中获取路径的几种基本的方法
package com.ygh.blog.realpath; import java.io.File; import java.io.IOException; import java.io.Input ...
- Android Automotive开发之一《编译自己的SDK 》 // TOBEDONE
自己动手编译最新Android源码及SDK : http://blog.csdn.net/dd864140130/article/details/51718187官方文档,怎样编译sdk : http ...
- JS循环语句作业讲解(折纸、兔子生兔子、买东西组合)
1.一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米: varn = 0;varg = 0.0001;while(){ g= g *2; n++ (g>8848bre ...