hdu3251 最小割
题意:
给n个城市,m条有向边。每条边有权值,如今有些城市能够选择得到。可选的城市有一个价值。可是要满足从1到达不了这些城市,为了满足要求能够去掉一些边,须要花费边的权值,问终于得到的最大价值是多少,并给出方案。
最小割 = 最大流
建图非常easy。源点就是1,设置汇点T。
按图中的有向边关系连边。
对于全部的可选择的城市u,连一条u->T的容量为w的边。
跑一遍最大流。即为最小割。
ans = sum - 最小割。
写出方案。就是走一遍bfs。看 哪些满流边(而且边的汇不是T,这是由于这种边是所选的城市扩展的边),打出来就好。
代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
const int N = 1000 + 10 ;
const int inf = 1000000000;
typedef long long ll;
struct Edge
{
int from,to,cap,flow;
};
int n,m,s,t,num,f;
int w[N],use[N];
int vis[2*N],cur[2*N];
vector<int> G[2*N];
vector<Edge> edges;
queue<int> cut;
void init()
{
edges.clear();
for(int i=1;i<=n;i++) G[i].clear();
memset(vis,0,sizeof(vis));
}
int add(int u,int v,int c)
{
edges.push_back((Edge){u,v,c,0});
edges.push_back((Edge){v,u,0,0});
num = edges.size();
G[u].push_back(num-2);
G[v].push_back(num-1);
}
int bfs()
{
int front;
memset(vis,0,sizeof(vis));
vis[s] = 1;
queue<int> q;
q.push(s);
while(!q.empty()){
front = q.front(); q.pop();
for(int i=0;i<G[front].size();i++)
{
Edge& e = edges[G[front][i]];
if(!vis[e.to] && e.cap > e.flow)
{
q.push(e.to);
vis[e.to] = vis[front]+1;
}
}
}
return vis[t];
}
int dfs(int x,int a)
{
if(x==t || a==0) return a;
int f=0,flow=0;
for(int i=0;i<G[x].size();i++){
Edge& e = edges[G[x][i]];
if(vis[e.to]==vis[x]+1 && (f=dfs(e.to,min(a,e.cap-e.flow)))>0 )
{
flow += f;
e.flow += f;
a -= f;
edges[G[x][i]^1].flow -= f;
if(a==0) break;
}
}
return flow;
}
int dinic()
{
int flow = 0;
while(bfs())
{
memset(cur,0,sizeof(cur));
flow += dfs(s,inf);
}
return flow;
}
void find_cut()
{
while(!cut.empty()) cut.pop();
memset(vis,0,sizeof(vis));
vis[1] = 1;
queue<int> q;
q.push(1);
int front;
while(!q.empty()){
front = q.front(); q.pop();
for(int i=0;i<G[front].size();i++){
Edge& e = edges[G[front][i]];
if(!vis[e.to] && e.cap > e.flow){
vis[e.to] = 1;
q.push(e.to);
}
}
}
for(int i=1;i<=n;i++){
if(vis[i])
for(int j=0;j<G[i].size();j++){
Edge& e = edges[G[i][j]];
if(G[i][j]&1) continue;
if(e.to!=t && !vis[e.to])
cut.push(G[i][j]/2+1);
}
}
return ;
}
void print_cut()
{
int len = cut.size();
int ro;
cout<<len<<" ";
for(int i=1;i<len;i++){
ro = cut.front();
cut.pop();
printf("%d ",ro);
}
ro = cut.front();
cut.pop();
printf("%d\n",ro);
}
int main()
{
int T,cas=0;
scanf("%d",&T);
while(T--){
ll sum = 0;
scanf("%d%d%d",&n,&m,&f);
init();
s = 1; t = n+1;
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
for(int i=1;i<=f;i++){
int u,w;
scanf("%d%d",&u,&w);
add(u,t,w);
sum += w;
}
ll ans = dinic();
find_cut();
printf("Case %d: %lld\n",++cas,sum-ans);
print_cut();
}
return 0;
}
hdu3251 最小割的更多相关文章
- HDU3251 Being a Hero(最小割)
题目大概一个国家n个城市由m条单向边相连,摧毁每条边都有一个费用.现在你可以选择所给的f个城市中的若干个,每个城市选择后都有一定的价值,但首都1号城市必须到达不了你选择的城市,因为你可能需要摧毁一些边 ...
- HDU3251 最大流(最小割)
Being a Hero Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 最大流&最小割 - 专题练习
[例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...
- BZOJ 1391: [Ceoi2008]order [最小割]
1391: [Ceoi2008]order Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1509 Solved: 460[Submit][Statu ...
- BZOJ-2127-happiness(最小割)
2127: happiness(题解) Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1806 Solved: 875 Description 高一 ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- BZOJ3438 小M的作物(最小割)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=3438 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为 ...
- 最大流-最小割 MAXFLOW-MINCUT ISAP
简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...
- bzoj1412最小割
太羞耻了,m n写反了(主要是样例n m相等) 建图方法比较高(ji)端(chu),对于可以加栅栏的地方连上1的边,然后求最小割即可 为了让代码优(suo)美(duan),我写了一个check,避免多 ...
随机推荐
- 配置CORS解决跨域调用—反思思考问题的方式
导读:最近都在用一套完整的Java EE的体系做系统,之前都是用spring框架,现在弄这个Java EE,觉得新鲜又刺激.但,由于之前没有过多的研究和使用,在应用的过程中,也出现了不少的问题.累积了 ...
- BZOJ4010 [HNOI2015]菜肴制作 【拓扑排序 + 贪心】
题目 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间 ...
- BZOJ2302 [HAOI2011]Problem c 【dp】
题目 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1,a ...
- 刷题总结——分配笔名(51nod1526 trie树)
题目: 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一个同学分配到一个笔名,每一个笔名必须分配给某个同学.现在定义笔名和真名之间的相关度是他们之间的最长公共前缀.设笔名 ...
- spring中MessageSource的配置使用方法1
Spring定义了访问国际化信息的MessageSource接口,并提供了几个易用的实现类.首先来了解一下该接口的几个重要方法: String getMessage(String code, Ob ...
- Linux System Programming 学习笔记(五) 进程管理
1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity in ...
- SpringCloud-分布式配置中心【入门介绍】
案例代码:https://github.com/q279583842q/springcloud-e-book 一. 为什么需要使用配置中心 1 服务配置的现状 2 常用的配置管理解决方案的缺点 3 为 ...
- 卸载重安firefox
把firefox完全卸载掉重装: 查看安装的firefox版本: dpkg --get-selections |grep firefox 根据命令结果卸载重装 比如: $ dpkg --get-sel ...
- jq ajax之beforesend(XHR)
用于在向服务器发送请求前添加一些处理函数.例如:搜寻附近店铺,未搜寻出来的时候显示:正在搜寻中... 常见的一种效果,在用ajax请求时,没有返回前会出现前出现一个转动的loading小图标或者“内容 ...
- 遍历删除List中的元素,会报错?
经常会碰到遍历集合,然后删除里面的对象报错, 纠结半天, 百度了一下,有大神说不能用for-each, for , 只能用迭代器,真的吗? 我就删成功了呢,看代码,请大神们指正! public s ...