POJ2125

题意简述:给定一个有向图,要通过某些操作删除所有的边,每一次操作可以选择任意一个节点删除由其出发的所有边或者通向它的所有边,两个方向有不同的权值。问最小权值和的解决方案,要输出操作。

乍一看是要用点去覆盖边,联想到二分图的最小点权覆盖,通过拆点,我们可以得到二分图。每个点都拆成两个点,一个作为入点,另一个作为出点。于是我们构建了一个标准的二分图最小点权覆盖的模型

解决二分图最小点权覆盖的的算法并不复杂,创造一个源点和汇点,源点到左边的点连边,容量为对应点的权值,同理右边的点向汇点连边。然后运行最大流,就可以得到最小权值和。

下一步就是输出解决方案,也就是求最小割边集。在运行完最大流的残量网络中由源点出发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 二分图 最小点权覆盖的更多相关文章

  1. POJ 2125 Destroying the Graph 二分图最小点权覆盖

    Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8198   Accepted: 2 ...

  2. POJ 2125 Destroying The Graph (二分图最小点权覆盖集+输出最小割方案)

    题意 有一个图, 两种操作,一种是删除某点的所有出边,一种是删除某点的所有入边,各个点的不同操作分别有一个花费,现在我们想把这个图的边都删除掉,需要的最小花费是多少. 思路 很明显的二分图最小点权覆盖 ...

  3. poj 2125 Destroying The Graph (最小点权覆盖)

    Destroying The Graph http://poj.org/problem?id=2125 Time Limit: 2000MS   Memory Limit: 65536K       ...

  4. POJ2125 Destroying The Graph 二分图 + 最小点权覆盖 + 最小割

    思路来源:http://blog.csdn.net/lenleaves/article/details/7873441 求最小点权覆盖,同样求一个最小割,但是要求出割去了那些边, 只要用最终的剩余网络 ...

  5. POJ2125 Destroying The Graph(二分图最小点权覆盖集)

    最小点权覆盖就是,对于有点权的有向图,选出权值和最少的点的集合覆盖所有的边. 解二分图最小点权覆盖集可以用最小割: vs-X-Y-vt这样连边,vs和X部点的连边容量为X部点的权值,Y部和vt连边容量 ...

  6. POJ - 2125 Destroying The Graph (最小点权覆盖)

    题意:给一张图,现在要删去所有的边,删去一个点的所有入边和所有出边都有其对应\(W_{i+}\)和\(W_{i-}\).求删去该图的最小花费,并输出解 分析:简而言之就是用最小权值的点集去覆盖所有的边 ...

  7. poj 3308 Paratroopers(二分图最小点权覆盖)

    Paratroopers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8954   Accepted: 2702 Desc ...

  8. POJ3308 Paratroopers(最小割/二分图最小点权覆盖)

    把入侵者看作边,每一行每一列都是点,选取某一行某一列都有费用,这样问题就是选总权最小的点集覆盖所有边,就是最小点权覆盖. 此外,题目的总花费是所有费用的乘积,这时有个技巧,就是取对数,把乘法变为加法运 ...

  9. POJ 3308 Paratroopers(最大流最小割の最小点权覆盖)

    Description It is year 2500 A.D. and there is a terrible war between the forces of the Earth and the ...

随机推荐

  1. jquery为某div下的所有textbox的赋值

    html代码 <input type="button" value="变量div_Alltext中的变量" onclick="Do_DivAll ...

  2. 再次写了第一个servlet

    费时2小时,熟悉tomcat和编写了第一个servlet

  3. 在PHP语言中使用JSON

      目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它. 我写过一篇<数据类型和JSON格式>,探讨它的设计思想.今天,我想总结一下PHP语言对它的支持,这是开发 ...

  4. CreateForm(

    /// <summary> /// 打开新的子窗体 /// </summary> /// <param name="strName">窗体的类名 ...

  5. Bzoj3756

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3756 题解:乱搞 代码: #include<iostream> #include ...

  6. 导航栏项目滑过时子菜单显示/隐藏jquery代码

    ;(function(window){    $('.menuitem').hover(function(){        $('>a',this).css('background-color ...

  7. IE6下完美兼容css3圆角和阴影属性的htc插件PIE.htc

    1.(推荐:)css插件PIE.htc,这个才是真正完美兼容css3的圆角和阴影属性在IE6环境下使用的效果,但要注意的是:下面的代码必须写在html文件的head标签内,否则无效(不能从外部引用下面 ...

  8. Delphi 常用函数记录

    //判断是否是数字 function IsNumeric(sDestStr: string): Boolean; //简写多余汉字 function SimplifyWord(sWord: strin ...

  9. js判断ip地址,子网掩码,网关的逻辑性检查

    因为要做静态地址配置的js校验,找了好多资料发现网上都是关于ip,mask的有效性检查,没有ip,submask,gateway的逻辑性判断,自己写下代码供需要的人参考. 普及下网关地址知识: 就是进 ...

  10. 天兔(Lepus)监控系统快速安装部署

    Lepus安装需要Lamp环境,Lamp环境的安装个人认为比较费劲,XAMPP的一键部署LAMP环境省心省力, lepus官网手册也建议采用XAMPP的方式安装,lepus也是在XAMPP上进行研发的 ...