POJ1815 Friendship(字典序最小最小割割边集)
看了题解。当时也觉得用邻接矩阵挺好写的,直接memset;然而邻接矩阵不懂得改,于是就放开那个模板,写了Dinic。。
方法是,按字典序枚举每一条满流的边,然后令其容量减1,如果最大流改变了,这条边就是属于某个最小割;接下来一直重复下去,直到得到一个割边集,而它自然是字典序最小的。
我在每次某条边容量减1后都重新计算一遍最大流,简单。。其实我知道是有这么一回事,把边容量减1后可以利用当前求出的最大流来得出新的最大流,这样会快一些,不过我不会。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF (1<<30)
int n,vs,vt,NV,c[][],f[][],level[];
bool bfs(){
memset(level,,sizeof(level));
bool vis[]={};
vis[vs]=;
int que[],front=,rear=;
que[rear++]=vs;
while(front<rear){
int u=que[front++];
for(int v=; v<=NV; ++v){
if(vis[v] || c[u][v]==f[u][v]) continue;
level[v]=level[u]+;
vis[v]=;
que[rear++]=v;
} }
return vis[vt+n];
}
int dfs(int u,int s){
if(u==vt+n) return s;
int res=s,tmp;
for(int v=; v<=NV; ++v){
if(level[v]!=level[u]+ || c[u][v]==f[u][v]) continue;
tmp=dfs(v,min(s,c[u][v]-f[u][v]));
f[u][v]+=tmp;
f[v][u]-=tmp;
s-=tmp;
}
return res-s;
}
int dinic(){
int res=;
while(bfs()) res+=dfs(vs,INF);
return res;
}
int main(){
int a;
scanf("%d%d%d",&n,&vs,&vt);
NV=n<<;
for(int i=;i<=n;++i){
c[i][i+n]=;
for(int j=;j<=n;++j){
scanf("%d",&a);
if(i==j || a==) continue;
c[i+n][j]=INF;
}
}
c[vs][vs+n]=INF; c[vt][vt+n]=INF;
if(c[vs+n][vt]){
puts("NO ANSWER!");
return ;
}
int ans=dinic();
printf("%d\n",ans);
for(int i=; i<=n&&ans; ++i){
if(i==vs||i==vt || f[i][i+n]==) continue;
memset(f,,sizeof(f));
c[i][i+n]=;
if(dinic()<ans){
--ans;
printf("%d ",i);
}else{
c[i][i+n]=;
}
}
return ;
}
POJ1815 Friendship(字典序最小最小割割边集)的更多相关文章
- POJ 2125 Destroying The Graph (二分图最小点权覆盖集+输出最小割方案)
题意 有一个图, 两种操作,一种是删除某点的所有出边,一种是删除某点的所有入边,各个点的不同操作分别有一个花费,现在我们想把这个图的边都删除掉,需要的最小花费是多少. 思路 很明显的二分图最小点权覆盖 ...
- hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)
/** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...
- POJ2125 Destroying The Graph (最小点权覆盖集)(网络流最小割)
Destroying The Graph Time Limit: 2000MS Memo ...
- POJ2125 Destroying The Graph(二分图最小点权覆盖集)
最小点权覆盖就是,对于有点权的有向图,选出权值和最少的点的集合覆盖所有的边. 解二分图最小点权覆盖集可以用最小割: vs-X-Y-vt这样连边,vs和X部点的连边容量为X部点的权值,Y部和vt连边容量 ...
- POJ 2125 最小点权覆盖集(输出方案)
题意:给一个图(有自回路,重边),要去掉所有边,规则:对某个点,可以有2种操作:去掉进入该点 的所有边,也可以去掉出该点所有边,(第一种代价为w+,第二种代价为w-).求最小代价去除所有边. 己思:点 ...
- [leetcode](4.21)2. 按字典序排列最小的等效字符串
给出长度相同的两个字符串:A 和 B,其中 A[i] 和 B[i] 是一组等价字符.举个例子,如果 A = "abc" 且 B = "cde",那么就有 'a' ...
- HDU 1569 - 方格取数(2) - [最大点权独立集与最小点权覆盖集]
嗯,这是关于最大点权独立集与最小点权覆盖集的姿势,很简单对吧,然后开始看题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1569 Time Limi ...
- 最小点权覆盖集&最大点权独立集
最小点权覆盖集 二分图最小点权覆盖集解决的是这样一个问题: 在二分图中,对于每条边,两个端点至少选一个,求所选取的点最小权值和. 方法: 1.先对图二分染色,对于每条边两端点的颜色不同 2.然后建立源 ...
- [Swift-2019力扣杯春季决赛]2. 按字典序排列最小的等效字符串
给出长度相同的两个字符串:A 和 B,其中 A[i] 和 B[i] 是一组等价字符.举个例子,如果 A = "abc" 且 B = "cde",那么就有 'a' ...
随机推荐
- [Android Pro] How to get recent tasks on Android “L”?
reference : http://stackoverflow.com/questions/24590533/how-to-get-recent-tasks-on-android-l/2688546 ...
- MVC4方法行为过滤器例子(用户登录)
在Model文件夹下添加一个类MyActionFilterAttribute继承于ActionFilterAttribute: using System; using System.Collectio ...
- 安装less
1.下载安装iterm(http://www.iterm2.com/) 2.打开iterm,输入 sudo npm install -g less
- SQLSERVER查询连接数
SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN (SELECT [DBID]FROM [Master].[dbo].[SYSDA ...
- SQL集合操作符样例(UNION,INTERSECT,EXCEPT)
由于MYSQL目前只实现了UNION, 所以后面两个就没得玩罗.... SELECT emp_id, assigned_branch_id -> FROM employee -> WHER ...
- Ajax 的 GET 和 POST 模式
Ajax 异步请求数据的方式有两种:GET 和 POST. 如果是 GET 模式,则直接将数据放置到异步请求的 URL 地址中,而 send() 方法不发送任何数据: var queryString ...
- Localstorage本地存储兼容函数
前言HTML5提供了本地存储的API:localstorage对象和sessionStorage对象,实现将数据存储到用户的电脑上.Web存储易于使用.支持大容量(但非无限量)数据同时存储,同时兼容当 ...
- 攻城狮在路上(叁)Linux(二十四)--- linux设置开机挂载及镜像文件挂载
虽然可以手动进行文件系统的挂载,但是每次都手动挂载就会很麻烦,开机挂载的目的就是实现文件系统的自动挂载. 一.开机挂载:/etc/fstab及/etc/mtab 主要是通过修改/etc/fstab文件 ...
- jq与js 区别
$(this).html(666); <div id="a">123</div> <script> $("#a").clic ...
- C语言中main函数的参数
转自:http://blog.csdn.net/cnctloveyu/article/details/3905720 我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上, ...