题意:给一个图(有自回路,重边),要去掉所有边,规则:对某个点,可以有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. 1653: Champion of the Swordsmanship

    1653: Champion of the Swordsmanship Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 11  Solved: 8[Subm ...

  2. readystatechange

    // alternative to DOMContentLoaded document.onreadystatechange = function () { if (document.readySta ...

  3. nodejs:遍历文件夹文件统计文件大小

    根据 http://blog.csdn.net/hero82748274/article/details/45700465这里的思路对读写文件做了一个 封装: webpack在打包的时候可以借助ass ...

  4. QT +样式表

    学习样式表的目的:可以设计出好看的控件.(比如可以给一些按钮设计成好看的图片) QT 样式表的思想很大程度上是来自于HTML的层叠式样式表(CSS),通过调用QWidget->setStyleS ...

  5. perl学习之:subs函数

    在Perl中,sub关键字主要是为了定义一个子例程,那么subs又是什么呢? 首先subs是一个函数,用于预先声明子例程,函数的参数是预声明的函数名列表.那么这个函数存在的意义是什么?首先,通过该函数 ...

  6. 关于springmvc返回json格式数据

    1.引入maven依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifac ...

  7. Python Flask+Mysql练习题

    #!/usr/bin/pythonfrom flask import Flask,render_template,request,redirect,sessionimport MySQLdb as m ...

  8. 练习题,新建数据库anyun

    一.新建数据库,数据库名为anyun mysql> create database anyun; Query OK, 1 row affected (0.00 sec) 二.查看数据库 mysq ...

  9. Java程序员---技能树

    计算机基础: 比如网络相关的知识. 其中就包含了 TCP 协议,它和 UDP 的差异.需要理解 TCP 三次握手的含义,拆.粘包等问题. 当然上层最常见的 HTTP 也需要了解,甚至是熟悉. 这块推荐 ...

  10. 九度oj 题目1214:丑数

    题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: ...