题意:

给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 最小割的更多相关文章

  1. HDU3251 Being a Hero(最小割)

    题目大概一个国家n个城市由m条单向边相连,摧毁每条边都有一个费用.现在你可以选择所给的f个城市中的若干个,每个城市选择后都有一定的价值,但首都1号城市必须到达不了你选择的城市,因为你可能需要摧毁一些边 ...

  2. HDU3251 最大流(最小割)

    Being a Hero Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. 最大流&最小割 - 专题练习

    [例1][hdu5889] - 算法结合(BFS+Dinic) 题意 \(N\)个点\(M\)条路径,每条路径长度为\(1\),敌人从\(M\)节点点要进攻\(1\)节点,敌人总是选择最优路径即最短路 ...

  4. BZOJ 1391: [Ceoi2008]order [最小割]

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1509  Solved: 460[Submit][Statu ...

  5. BZOJ-2127-happiness(最小割)

    2127: happiness(题解) Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1806  Solved: 875 Description 高一 ...

  6. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  7. BZOJ3438 小M的作物(最小割)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=3438 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为 ...

  8. 最大流-最小割 MAXFLOW-MINCUT ISAP

    简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...

  9. bzoj1412最小割

    太羞耻了,m n写反了(主要是样例n m相等) 建图方法比较高(ji)端(chu),对于可以加栅栏的地方连上1的边,然后求最小割即可 为了让代码优(suo)美(duan),我写了一个check,避免多 ...

随机推荐

  1. Oracle的表空间、数据文件、用户

          每一个Oracle数据库都是由三种类型的文件组成:数据文件(Data File).日志文件(Log File)和控制文件(Control File).数据库的文件为数据库信息提供真正的物理 ...

  2. 九度oj 题目1365:贝多芬第九交响曲

    现在在一块空的场地上会有一个大的二维棋盘,裁判会给你指定初始位置及一座贝多芬雕像所处的位置,你开始时就站在裁判指定的初始位置处,你的目标是跳到贝多芬雕像的位置.为了给比赛增加一定的难度,你在棋盘上行走 ...

  3. 【Luogu】P1430序列取数(DP)

    题目链接 博弈DP太喵了qwq 设f[i][j]表示剩下区间[i,j]要取,先手最大值 明显我们要从这区间里面拿个最大的 就等价于这段区间的前缀和,我们要给对手留下个最小的 就是f[i][j]=sum ...

  4. 刷题总结——跳蚤(poj1091容斥+分解质因数)

    题目: Description Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有 ...

  5. 【bzoj5110】Yazid的新生舞会

    这里是 $THUWC$ 选拔时间 模拟赛的时候犯 $SB$ 了,写了所有的部分分,然后直接跑过了 $4$ 个大样例(一个大样例是一个特殊情况)…… 我还以为我非常叼,部分分都写对了,于是就不管了…… ...

  6. el-select绑定值为对象时,报错[Vue warn]: <transition-group> children must be keyed: <ElTag>

    解决方法: <el-select v-model="syncParams.toSlaveList" multiple value-key="ip" pla ...

  7. BaseResponse

    package common; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; /** * ...

  8. 【bzoj4031】[HEOI2015]小Z的房间 && 【bzoj4894】天赋 (矩阵树定理)

    来两道矩阵树模板: T1:[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形 ...

  9. 容器 What, Why, How

    学习任何东西都可以按照3W的框架进行,容器技术也是一样,先回答 What.Why 和 How 这三个问题. What - 什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...

  10. 卸载重安firefox

    把firefox完全卸载掉重装: 查看安装的firefox版本: dpkg --get-selections |grep firefox 根据命令结果卸载重装 比如: $ dpkg --get-sel ...