POJ 2125 Destroying The Graph 二分图 最小点权覆盖
题意简述:给定一个有向图,要通过某些操作删除所有的边,每一次操作可以选择任意一个节点删除由其出发的所有边或者通向它的所有边,两个方向有不同的权值。问最小权值和的解决方案,要输出操作。
乍一看是要用点去覆盖边,联想到二分图的最小点权覆盖,通过拆点,我们可以得到二分图。每个点都拆成两个点,一个作为入点,另一个作为出点。于是我们构建了一个标准的二分图最小点权覆盖的模型
解决二分图最小点权覆盖的的算法并不复杂,创造一个源点和汇点,源点到左边的点连边,容量为对应点的权值,同理右边的点向汇点连边。然后运行最大流,就可以得到最小权值和。
下一步就是输出解决方案,也就是求最小割边集。在运行完最大流的残量网络中由源点出发BFS所有可以到达的点构成了源点集。对于剩下的边,如果满流且一个端点属于源点集而另一个端点不属于,则这条边属于最小割。
代码实现比较简单:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int maxn=110*2,maxm=5000,s=0,INF=9999999;
int n,m,t,cap[maxn][maxn],flow[maxn][maxn],w[maxn]; int augment(int fa[])
{
int d[maxn];
memset(d,0,sizeof(d));
d[s]=INF;
queue<int>q;q.push(s);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=s;i<=t;i++)
{
if((d[i]!=0)||(cap[u][i]<=flow[u][i]))continue;
d[i]=min(d[u],cap[u][i]-flow[u][i]);
q.push(i);
fa[i]=u;
if(i==t)return d[t];
}
}
return d[t];
} int maxflow()
{
int fa[maxn];
int ans=0; while(true)
{
int nflow=augment(fa);
if(nflow==0)return ans;
ans+=nflow;
for(int i=t;i!=s;i=fa[i])
{
flow[fa[i]][i]+=nflow;
flow[i][fa[i]]-=nflow;
}
}
}
vector<int> mincut()
{
bool vis[maxn];
memset(vis,0,sizeof(vis));
vis[s]=true;
queue<int>q;
q.push(s);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=s;i<=t;i++)
{
if((vis[i])||(cap[u][i]<=flow[u][i]))continue;
vis[i]=true;
q.push(i);
}
}
vector<int>ans;
for(int i=s;i<=t;i++)
if(vis[i])for(int j=s;j<=t;j++)
if(!vis[j]&&cap[i][j]==flow[i][j]&&cap[i][j]>0)
{
if(i==s){ans.push_back(j);}
if(j==t){ans.push_back(i);}
}
return ans;
} void print(vector<int> vec)
{
cout<<vec.size()<<endl;
for(int i=0;i<vec.size();i++)
{
if(vec[i]<=n)cout<<vec[i]<<" -"<<endl;
else cout<<vec[i]-n<<" +"<<endl;
}
}
int main()
{
ios::sync_with_stdio(false);
memset(cap,0,sizeof(cap));memset(flow,0,sizeof(flow));
cin>>n>>m;
t=n*2+1;
for(int i=1;i<=n*2;i++)
cin>>w[i];
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
cap[a][b+n]=INF;
}
for(int i=1;i<=n;i++)
{
cap[s][i]=w[i+n];
cap[i+n][t]=w[i];
}
cout<<maxflow()<<endl;
print( mincut() );
return 0;
}
东北欧赛区的题目还是很给力的
POJ 2125 Destroying The Graph 二分图 最小点权覆盖的更多相关文章
- POJ 2125 Destroying the Graph 二分图最小点权覆盖
Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8198 Accepted: 2 ...
- POJ 2125 Destroying The Graph (二分图最小点权覆盖集+输出最小割方案)
题意 有一个图, 两种操作,一种是删除某点的所有出边,一种是删除某点的所有入边,各个点的不同操作分别有一个花费,现在我们想把这个图的边都删除掉,需要的最小花费是多少. 思路 很明显的二分图最小点权覆盖 ...
- poj 2125 Destroying The Graph (最小点权覆盖)
Destroying The Graph http://poj.org/problem?id=2125 Time Limit: 2000MS Memory Limit: 65536K ...
- POJ2125 Destroying The Graph 二分图 + 最小点权覆盖 + 最小割
思路来源:http://blog.csdn.net/lenleaves/article/details/7873441 求最小点权覆盖,同样求一个最小割,但是要求出割去了那些边, 只要用最终的剩余网络 ...
- POJ2125 Destroying The Graph(二分图最小点权覆盖集)
最小点权覆盖就是,对于有点权的有向图,选出权值和最少的点的集合覆盖所有的边. 解二分图最小点权覆盖集可以用最小割: vs-X-Y-vt这样连边,vs和X部点的连边容量为X部点的权值,Y部和vt连边容量 ...
- POJ - 2125 Destroying The Graph (最小点权覆盖)
题意:给一张图,现在要删去所有的边,删去一个点的所有入边和所有出边都有其对应\(W_{i+}\)和\(W_{i-}\).求删去该图的最小花费,并输出解 分析:简而言之就是用最小权值的点集去覆盖所有的边 ...
- poj 3308 Paratroopers(二分图最小点权覆盖)
Paratroopers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8954 Accepted: 2702 Desc ...
- POJ3308 Paratroopers(最小割/二分图最小点权覆盖)
把入侵者看作边,每一行每一列都是点,选取某一行某一列都有费用,这样问题就是选总权最小的点集覆盖所有边,就是最小点权覆盖. 此外,题目的总花费是所有费用的乘积,这时有个技巧,就是取对数,把乘法变为加法运 ...
- POJ 3308 Paratroopers(最大流最小割の最小点权覆盖)
Description It is year 2500 A.D. and there is a terrible war between the forces of the Earth and the ...
随机推荐
- 用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台)(转)
源:用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台) 代码在2011年全国电子大赛结束后(2011年9月3日)发布,多个版本,注释详细. /*********************** ...
- stm单片机之STM32F4-Discovery资料汇总 (转载自http://blog.163.com/thinki_cao/blog/static/83944875201362493134992/)
STM32F4的资料大部分都在这里: http://www.stmcu.org/download/index.php?act=ziliao&id=150 根据个人的理解对这些资料作了一些规律, ...
- module_param()函数
1.定义模块参数的方法: module_param(name, type, perm); 其中,name:表示参数的名字; type:表示参数的类型; perm:表示参数的访问权限; ...
- Sublime Text 快捷键--持续更新
快捷键 功能 说明 ctrl+D 选取一个单词连续按组合键会选择页面所有相同的这个单词 ctrl+Z 撤销上一个操作 ctrl+Y 恢复上一个操作 ctrl+shift+F 底部打开搜索全 ...
- UITextField 之 失去焦点 收起键盘
1. 代理 UITextFieldDelegate 2. 设置代理 textfield.delegate = self; 3. 代理事件处理 #pragma mark - textfiled代理 -( ...
- iOS 开发 之 编程知识点
iOS 创建和设置pch iOS 之 时间格式与字符串转换 iOS 之 二维码生成与扫描(LBXScan) iOS 之 定时器 iOS 之 通知 iOS 之 NSString 去除前后空格和回车键 i ...
- JavaScript对象属性的基础教程指南
JavaScript是使用“对象化编程”的,或者叫“面向对象编程”的.所谓“对象化编程”,意思是把JavaScript能涉及的范围划分成大大小小的对象,对象下面还继续划分对象直至非常详细为止,所有的编 ...
- 支持wmv、mpg、mov、avi格式的网页视频播放代码
这2天一直在整金网奖的相关项目,比较头大的就是网页视频播放了,需要考虑各种不同格式的视频,然后找相应的视频播放器. 这次使用了2种方法对这些视频进行处理: 1.使用ckplayer网页视频播放器 ck ...
- phpcms 杂乱总结
1.根据catid 获取 栏目名称 $CATEGORYS = getcache('category_content_'.$siteid,'commons'); $name = {$CATEGORYS[ ...
- MySQL 替换部分电话号码为000
要做敏感信息剔除,要求又不能全换成同一个号码影响测试,想了几个方法,最终采用替换部分电话号码为000来做到敏感信息覆盖. mysql>update phone setb=replace(b,su ...