题意:

在一个有向图中,有n个点,m条边$n \le 1000 \And \And  m \le 100000$

每条边有一个破坏的花费,有些点可以被选择并获得对应的金币。

假设一个可以选的点是$x$,你只有破坏了从1号点到$x$的路,才可以得到$x$对应的金币。

思路:

点和边的区别在于,你放弃一个点得到0,选择一个点得到val。你放弃选择一条边得到0,选择一条边得到 - val。

那么我们先把每个点的权值加到ans中,最够减去这个图的最小割即可。

由于要输出破坏边的方案,所以要dfs染色,又由于是有向边,所以破坏的边是起点属于s的边。

// #pragma GCC optimize(2)
// #pragma GCC optimize(3)
// #pragma GCC optimize(4)
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert>
//#include <unordered_set>
//#include <unordered_map>
// #include<bits/extc++.h>
// using namespace __gnu_pbds;
using namespace std;
#define pb push_back
#define fi first
#define se second
#define debug(x) cerr<<#x << " := " << x << endl;
#define bug cerr<<"-----------------------"<<endl;
#define FOR(a, b, c) for(int a = b; a <= c; ++ a) typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll; const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} /**********showtime************/
const int maxn = ;
int head[maxn], gtot = ;
struct Edge{
int u, v, w;
int id;
int nxt;
} edge[];
void addedge(int u, int v, int w, int id) {
edge[gtot].u = u;
edge[gtot].v = v;
edge[gtot].w = w;
edge[gtot].nxt = head[u];
edge[gtot].id = id;
head[u] = gtot++; edge[gtot].u = v;
edge[gtot].v = u;
edge[gtot].w = ;
edge[gtot].nxt = head[v];
edge[gtot].id = ;
head[v] = gtot++;
}
int n,m,f;
vector<int>vec;
int cur[maxn],dis[maxn];
bool bfs(int s, int t) {
for(int i=s; i<=t; i++) {
cur[i] = head[i];
dis[i] = inf;
}
dis[s] = ; queue<int>que;
que.push(s);
while(!que.empty()) {
int u = que.front(); que.pop();
for(int i=head[u]; ~i; i=edge[i].nxt) {
int v = edge[i].v, w = edge[i].w;
if(w > && dis[v] > dis[u] + ) {
dis[v] = dis[u] + ;
que.push(v);
}
}
}
return dis[t] < inf;
}
int dfs(int u, int t, int maxflow) {
if(u == t || maxflow == ) return maxflow;
for(int i=cur[u]; ~i; i=edge[i].nxt) {
cur[u] = i;
int v = edge[i].v, w = edge[i].w;
if(w > && dis[v] == dis[u] + ) {
int f = dfs(v, t, min(maxflow, w));
if(f > ) {
edge[i].w -= f;
edge[i ^ ].w += f;
return f;
}
}
}
return ;
}
int dinic(int s, int t) {
int flow = ;
while(bfs(s, t)) {
while(int f = dfs(s, t, inf))
flow += f;
}
return flow;
}
int col[maxn];
void colnode(int u) {
col[u] = ;
for(int i=head[u]; ~i; i= edge[i].nxt) {
int v = edge[i].v, w = edge[i].w;
if(w && col[v] == ) colnode(v);
}
}
int main(){
int T; scanf("%d", &T);
int cas = ;
while(T--) {
scanf("%d%d%d", &n, &m, &f);
int s = , t = n + ;
for(int i=s; i<=t; i++) head[i] = -, col[i] = ;
gtot = ; for(int i=; i<=m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
addedge(u, v, w, i);
} int sum = ;
addedge(s, , inf, );
for(int i=; i<=f; i++) {
int u, w;
scanf("%d%d", &u, &w);
addedge(u, t, w, );
sum += w;
} sum = sum - dinic(s, t);
printf("Case %d: %d\n", ++cas, sum);
colnode(s);
vec.clear();
for(int i=; i<gtot; i++) {
int u = edge[i].u, v = edge[i].v, w = edge[i].w;
int id = edge[i].id;
if(col[u] == && col[v] == && id) {
vec.pb(id);
}
}
printf("%d", vec.size());
// sort(vec.begin(), vec.end());
for(int v : vec) {
printf(" %d", v);
}
puts("");
}
return ;
}

[HDU 3521] [最小割] Being a Hero的更多相关文章

  1. Being a Hero (hdu 3251 最小割 好题)

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

  2. hdu 4289(最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4289 思路:求最小花费,最小割应用,将点权转化为边权,拆点,(i,i+n)之间连边,容量为在城市i的花 ...

  3. hdu 5076 最小割灵活运用

    这意味着更复杂的问题,关键的事实被抽象出来:每个点,能够赋予既有的值(挑两个一.需要选择,设定ai,bi). 寻找所有和最大.有条件:如果两个点同时满足: 1,:二进制只是有一个不同之处.  2:中的 ...

  4. Game HDU - 3657(最小割)

    Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. hdu 1565 最小割

    黑白染色,源指向白,黑指向汇,容量都是方格中数的大小,相邻的格子白指向黑,容量为oo,然后求一次最小割. 这个割是一个简单割,如果只选择不在割中的点,那么一种割就和一个选数方案一一对应,割的大小就是不 ...

  6. hdu 3657 最小割的活用 / 奇偶方格取数类经典题 /最小割

    题意:方格取数,如果取了相邻的数,那么要付出一定代价.(代价为2*(X&Y))(开始用费用流,敲升级版3820,跪...) 建图:  对于相邻问题,经典方法:奇偶建立二分图.对于相邻两点连边2 ...

  7. hdu 3657 最小割(牛逼!!!!)总算理解了

    <strong></strong> 转载:http://blog.csdn.net/me4546/article/details/6662959 加颜色的太棒了!!! 在网上看 ...

  8. hdu 3691最小割将一个图分成两部分

    转载地址:http://blog.csdn.net/xdu_truth/article/details/8104721 题意:题给出一个无向图和一个源点,让你求从这个点出发到某个点最大流的最小值.由最 ...

  9. hdu 1569 最小割

    和HDU 1565是一道题,只是数据加强了,貌似轮廓线DP来不了了. #include <cstdio> #include <cstring> #include <que ...

随机推荐

  1. Linux Shell 中 > 和 >> 的异同点和应用场景

    Linux Shell 中 > 和 >> 的异同点和应用场景 > 和 >> 的异同点 举例说明(start.sh 为某个服务的启动脚本,start.log 为某服务 ...

  2. golang(11) 反射用法详解

    原文链接:http://www.limerence2017.com/2019/10/14/golang16/ 反射是什么 反射其实就是通过变量动态获取其值和类型的一种技术,有些语言是支持反射的比如py ...

  3. YAML基础知识及搭建一台简洁版guestbook

    一,前言 前面我们已经搭建过简易版k8s集群了,在此基础上可以搭建一个简洁版guestbook ,以便来学习k8s创建pod的整个过程. 二,在此之前,我们还需要学习一下YAML基础知识 YAML 基 ...

  4. Centos7下yum安装kubernetes

    一.前言    Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.动态扩缩容等功能套件,目前centos yum源上 ...

  5. pytorch神经网络层搭建方法

    神经网络层的搭建主要是两种方法,一种是使用类(继承torch.nn.Moudle),一种是使用torch.nn.Sequential来快速搭建. 1)首先我们先加载数据: import torchim ...

  6. v8 google 下载及编译

    ubuntu环境下进行 参考文档: http://code.google.com/p/v8/wiki/BuildingWithGYP (一) 源码下载及编译 1, Google v8 官网:http: ...

  7. classmethod自己定制

    # # 利用描述符原理定义一个@classmethod # class ClassMethod: # def __init__(self,func): # self.func = func # def ...

  8. netcore程序部署 docker 异常 --生成图片二维码缺少libdl

    最近因业务需求需要在程序中实现二维码图片生成,于是就用到QRCoder开发库.最终在windows环境下部署运行没问题,但切换到docker(centos7.0)后发现是有问题的. 错误信息提示:Th ...

  9. 前端开发工具包 WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧

    ​ 前端开发工具包WijmoJS在2019年的第一个主要版本2019V1已经发布,本次发布包括了更加易用的在线Demo系统.各控件新增功能.NPM 包的改动,以及全新的浏览器API组件. WijmoJ ...

  10. ADG环境搭建

    一:实验环境介绍PC机系统: CentOS 6.5(64位)数据库版本: Oracle 11gR2 11.2.0.4 (64位)IP地址规划:主数据库10.110.9.41 SID:orapridb_ ...