题意:给一个图(有自回路,重边),要去掉所有边,规则:对某个点,可以有2种操作:去掉进入该点

的所有边,也可以去掉出该点所有边,(第一种代价为w+,第二种代价为w-)。求最小代价去除所有边。





己思:点的权被分为出入?必然拆点啊!每个点一分为二,点权:出的为出点权,入的为入点权,原来边仍在

,注意,这里(1-)->(1+),不多添加边,因为相当于求新图的最小点权覆盖集(覆盖所有边,每选一个点

恰好去除了它的边(要原图的入边或出边),),所以不可以在新图上再添加边(这里不是到不到的问题了)

,若添加边i-->i+,最小割可能发生变化。所以求二分图最小割问题,=新添s,t的最大流。

这题要输出方案,即最小点权覆盖集的点,即最小割(该二分图为简单割),遍历边,若该边俩头

vis[]值(dinic后)不同,(i%2==0)必然为最小割边。

ps:神题??

#include<iostream>  //110ms ,1A
#include<queue>
#include<cstdio>
#include<vector>
using namespace std;
int n,m; int e[30000][3];int head[208];int nume=0;
const int inf=0x3f3f3f3f;
void addedge(int f,int l,int w)
{
e[nume][0]=l;e[nume][1]=head[f];head[f]=nume;
e[nume++][2]=w;
e[nume][0]=f;e[nume][1]=head[l];head[l]=nume;
e[nume++][2]=0;
}
int vis[205];int level[205];
bool bfs()
{
for(int i=0;i<=2*n+1;i++)
vis[i]=level[i]=0; vis[0]=1;queue<int>q;q.push(0);
while(!q.empty())
{
int cur=q.front();q.pop();
for(int i=head[cur];i!=-1;i=e[i][1])
{ int v=e[i][0];
if(!vis[v]&&e[i][2]>0)
{
level[v]=level[cur]+1;
if(v==n*2+1)return 1;
vis[v]=1;
q.push(v);
}
}
}
return vis[n*2+1];
}
int dfs(int u,int minf)
{
if(minf==0||u==n*2+1)return minf;
int sumf=0,f;
for(int i=head[u];i!=-1&&minf;i=e[i][1])
{ int v=e[i][0];
if(level[v]==level[u]+1&&e[i][2]>0)
{
f=dfs(v,minf<e[i][2]?minf:e[i][2]);
e[i][2]-=f;e[i^1][2]+=f;
sumf+=f;minf-=f;
}
}
return sumf;
}
int dinic()
{
int sum=0;
while(bfs())
sum+=dfs(0,inf);
return sum;
}
int main()
{
scanf("%d%d",&n,&m); //建图
int temp,ff,ll; nume=0;
for(int i=0;i<n*2+1;i++)
head[i]=-1;
for(int i=1;i<=n;i++)
{
scanf("%d",&temp);
addedge(i+n,n*2+1,temp);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&temp);
addedge(0,i,temp);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&ff,&ll);
addedge(ff,ll+n,inf);
}
int ans=dinic();
printf("%d\n",ans);
int count=0;
vector<int>cut1,cut2; // 找方案,
for(int i=0;i<=2*n+1;i++)
for(int j=head[i];j!=-1;j=e[j][1])
{
if(j%2==0&&e[j][2]==0&&vis[i]==1&&vis[e[j][0]]==0) //最小割边
{
count++;
if(i==0)
cut1.push_back(e[j][0]);
else if(e[j][0]==2*n+1)
cut2.push_back(i-n);
}
}
printf("%d\n",count);
for(int i=0;i<cut1.size();i++)
printf("%d -\n",cut1[i]);
for(int i=0;i<cut2.size();i++)
printf("%d +\n",cut2[i]);
return 0;
}

POJ 2125 最小点权覆盖集(输出方案)的更多相关文章

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

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

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

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

  3. POJ2125 Destroying The Graph (最小点权覆盖集)(网络流最小割)

                                                          Destroying The Graph Time Limit: 2000MS   Memo ...

  4. HDU 1569 - 方格取数(2) - [最大点权独立集与最小点权覆盖集]

    嗯,这是关于最大点权独立集与最小点权覆盖集的姿势,很简单对吧,然后开始看题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1569 Time Limi ...

  5. 最小点权覆盖集&最大点权独立集

    最小点权覆盖集 二分图最小点权覆盖集解决的是这样一个问题: 在二分图中,对于每条边,两个端点至少选一个,求所选取的点最小权值和. 方法: 1.先对图二分染色,对于每条边两端点的颜色不同 2.然后建立源 ...

  6. hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)

    /** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...

  7. poj 3308(最小点权覆盖、最小割)

    题目链接:http://poj.org/problem?id=3308 思路:裸的最小点权覆盖,建立超级源点和超级汇点,将源点与行相连,容量为这行消灭敌人的代价,将列与汇点相连,容量为这列消灭敌人的代 ...

  8. poj2125 最小点权覆盖集

    题意:有一张图,对于每个点,有出边和入边,现在目的是删除改图的所有边,对于每个点,删除出边的花费Wi-,删除入边的花费Wi+,现在的目的求删去所有边后的花费最小. 建图方法:对于每个点i,拆点为i,i ...

  9. HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]

    题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...

随机推荐

  1. Robot Framework(十) 执行测试用例——测试执行

    3.2测试执行 本节描述如何执行从解析的测试数据创建的测试套件结构,如何在失败后继续执行测试用例,以及如何正常停止整个测试执行. 3.2.1执行流程 执行套房和测试 设置和拆卸 执行顺序 3.2.2继 ...

  2. shell脚本,计算1+2+3+....100等于多少?

    第一种方法,通过for循环来计算[root@localhost wyb]# cat yibai.sh #!/bin/bash #从1+++...100的结果 i= ` do sum=$(($sum+i ...

  3. mac拷贝原版和权限修复的命令行工具

    建议直接从安装盘中用命令复制,因为上传的kext权限会变,导致签名失败. 假定安装盘盘符是install_osx: sudo cp -R /Volumes/install_osx/S*/L*/E*/A ...

  4. RN原生方法setNativeProps

    https://facebook.github.io/react-native/docs/direct-manipulation.html setNativeProps可以直接修改底层native组件 ...

  5. 如何用纯 CSS 绘制一个充满动感的 Vue logo

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/zaqKPx 可交互视频教 ...

  6. C/SV/VERILOG语句块界定符不一样

    C是一对大括号{} SV /VERILOG 是begin...end

  7. perl之更多的控制结构

    1.unless/if结构 unless 条件为假的时候 才执行语句块. eg: unless($fred =~ /^[A-Z_]\w*$/i){ print "The value of \ ...

  8. java 比较String StringBuffer StringBuilder

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  9. (原) 剑指offer--之数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.   初次看题觉得这题好简单,直接用库函数power()不就行了,仔细想了想,万 ...

  10. MIP启发式算法:爬山算法 (Hill climbing)

    本文主要记录和分享学习到的知识,算不上原创. *参考文献见链接. 本文讲述的是求解MIP问题的启发式算法中的爬山算法 (Hill climbing). 目录 前言 Hill climbing 的过程 ...