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,避免多 ...
随机推荐
- 九度oj 题目1513:二进制中1的个数
题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. 对于每个输入文件,第一行输入一个整数T,代表测试样例的数量.对于每个测试样例输入为一个 ...
- Goal Oriented Action Planning for a Smarter AI
Goal Oriented Action Planning for a Smarter AI by Brent Owens23 Apr 2014 Goal Oriented Action Planni ...
- [AtCoderContest075F]Mirrored
[AtCoderContest075F]Mirrored 试题描述 For a positive integer \(n\), we denote the integer obtained by re ...
- sklearn python API
sklearn python API LinearRegression from sklearn.linear_model import LinearRegression # 线性回归 # modul ...
- BZOJ3991 [SDOI2015]寻宝游戏 【dfs序 + lca + STL】
题目 小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可以任意在地图的道路 ...
- poj1734Sightseeing trip
Sightseeing trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6811 Accepted: 2602 ...
- 推荐个PMP的内容,广州有需要的朋友可以参考看看
慧翔天地PMP®培训机构简介 广州慧翔企业管理咨询有限公司注册于2012年8月14日,注册资金200万元人民币.实际上从2011年就已经开始从事PMP推广及教学工作(2010年曾代理智鼎东方华南市场, ...
- 【CF314C】Sereja and Subsequences(DP,树状数组)
题意:给定一个N个数的数列,求所有不同不下降子序列的乘积之和,其中不同指的是组成它的数字和长度不完全相同 n (1 ≤ n ≤ 10^5) a[i]<=10^6 思路:考虑DP.设DP[a[i] ...
- 标准C程序设计七---71
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- /sys/class/gpio 文件接口操作IO端口(s3c2440)
http://blog.csdn.net/mirkerson/article/details/8464231 在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网上大多数的 ...