hdu6214(求最小割最少边数)
来源:互联网 发布:2016中国人口迁移数据 编辑:程序博客网 时间:2024/05/21 07:48
题目
好像是和hdu3987差不多的?传送门
有两种方法:
1、对于所有容量值扩大(边数+1)倍然后+1,跑一边最大流得到的MAXFLOW/(边数+1)即为最大流,MAXFLOW%(边数+1)即最小割的边数。
(强行解释一波:我们可以将这个图里额外加的1作为最后计算,也就是如果最后某条增广路的1被拿走了那这就是最小割边之一)
2、跑一边最大流,然后把残量网络里的容量为0的边改为1,其他的边的容量改为inf,再跑一边最大流。就是答案。
第一种方法:
#include<bits/stdc++.h>using namespace std;const int MAXN = 100010;//点数的最大值const int MAXM = 400010;//边数的最大值const int INF = 0x3f3f3f3f;#define ll long longstruct Edge{ int to,next; ll cap,flow;} edge[MAXM]; //注意是MAXMint tol;int head[MAXN];int gap[MAXN],dep[MAXN],pre[MAXN],cur[MAXN];void init(){ tol = 0; memset(head,-1,sizeof(head));}//加边,单向图三个参数,双向图四个参数void addedge(int u,int v,ll w,int rw=0){ edge[tol].to = v; edge[tol].cap = w; edge[tol].next = head[u]; edge[tol].flow = 0; head[u] = tol++; edge[tol].to = u; edge[tol].cap = rw; edge[tol].next = head[v]; edge[tol].flow = 0; head[v]=tol++;}//输入参数:起点、终点、点的总数//点的编号没有影响,只要输入点的总数ll sap(int start,int end,int N){ memset(gap,0,sizeof(gap)); memset(dep,0,sizeof(dep)); memcpy(cur,head,sizeof(head)); int u = start; pre[u] = -1; gap[0] = N; ll ans = 0; while(dep[start] < N) { if(u == end) { int Min = INF; for(int i = pre[u]; i != -1; i = pre[edge[i^1].to]) if(Min > edge[i].cap - edge[i].flow) Min = edge[i].cap - edge[i].flow; for(int i = pre[u]; i != -1; i = pre[edge[i^1].to]) { edge[i].flow += Min; edge[i^1].flow -= Min; } u = start; ans += Min; continue; } bool flag = false; int v; for(int i = cur[u]; i != -1; i = edge[i].next) { v = edge[i].to; if(edge[i].cap - edge[i].flow && dep[v]+1 == dep[u]) { flag = true; cur[u] = pre[v] = i; break; } } if(flag) { u = v; continue; } int Min = N; for(int i = head[u]; i != -1; i = edge[i].next) if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min) { Min = dep[edge[i].to]; cur[u] = i; } gap[dep[u]]--; if(!gap[dep[u]])return ans; dep[u] = Min+1; gap[dep[u]]++; if(u != start) u = edge[pre[u]^1].to; } return ans;}int main(){ int t,n,m,vs,vt; scanf("%d",&t); while (t--) { init(); scanf("%d %d",&n,&m); scanf("%d %d",&vs,&vt); for(int i=0;i<m;i++) { int u,v,w; scanf("%d %d %d",&u,&v,&w); addedge(u,v,w*MAXM+1); } ll ans = sap(vs,vt,n)%MAXM; printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- hdu6214(求最小割最少边数)
- hdu6214-最小割集中边数最少
- hdu6214—Smallest Minimum Cut(最小割的最少割边)
- HDU6214 Smallest Minimum Cut【最小割-最小边数】
- HDU6214 Smallest Minimum Cut 【最大流求最小割边】
- HDU6214 Smallest Minimum Cut 最小割/最少边 [2017 ACM/ICPC Asia Regional Qingdao Online]
- HDU 6214 Smallest Minimum Cut(求最小割的最少边数)
- usaco 4.4 Pollutant Control(最小割最少边数字典序最小)
- hdu 3987(求边最少的最小割)
- hdu Smallest Minimum Cut 边数最少的最小割
- hdoj 3987 Harry Potter and the Forbidden Forest 【求所有最小割里面 最少的边数】
- HDU 6214 Smallest Minimum Cut(网络流 最小割最少边数)
- HDU6214(最小割SAP模板题)
- hdu3987(最小割最小边数)
- hdu6214-最小割边数&最大流最小割-Smallest Minimum Cut
- HDU 3987 Harry Potter and the Forbidden Forest(最小割中的最少割边)经典
- hdu 6214 割边最少的最小割
- 多校15场WHU Harry Potter and the Forbidden Forest(求网络的最小割的最小边数)
- win7 64位安装redis 及Redis Desktop Manager使用
- 多台centos虚拟机通过双网卡实现相互ping通和集群联网
- Java程序的基本原则
- 案例讲解安卓的事件传递机制
- bash介绍与入门
- hdu6214(求最小割最少边数)
- COMPOSITE(组合)模式
- PyTorch基本用法(五)——分类
- Android 设置viewId
- git clone push github 代理提速.md
- 在Windows下安装chromedriver
- spring与mybatis整合及事务控制
- 第一份博客的纪念
- LeetCode-53-Maximum Subarray 贪心