博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【luogu P3931 SAC E#1 - 一道难题 Tree】 题解
阅读量:5134 次
发布时间:2019-06-13

本文共 1877 字,大约阅读时间需要 6 分钟。

题目链接:

肉眼观察题目感觉可以跑最大流。
证明是如果拆断一棵树,可以最小割,最小割等于最大流。
注意:
图是无向边,在网络流里建两次边,即四次。
统计一下叶子节点,再建一个超级汇点,所有距离为inf。

#include 
#include
#include
#include
#include
using namespace std;const int maxn = 1000000 + 10;const int inf = 1e9;int isleaf[maxn];int n, m, s, t, deep[maxn], maxflow;struct edge{ int next, to, len;}e[maxn<<2];int head[maxn], cnt = -1, cur[maxn];queue
q;void add(int u, int v, int w, bool flag){ e[++cnt].next = head[u]; e[cnt].to = v; if(flag) e[cnt].len = w; head[u] = cnt;}bool bfs(int s, int t){ memset(deep, 0x7f, sizeof(deep)); while(!q.empty()) q.pop(); for(int i = 1; i <= n; i++) cur[i] = head[i]; deep[s] = 0; q.push(s); while(!q.empty()) { int now = q.front(); q.pop(); for(int i = head[now]; i != -1; i = e[i].next) { if(deep[e[i].to] > inf && e[i].len) { deep[e[i].to] = deep[now] + 1; q.push(e[i].to); } } } if(deep[t] < inf) return true; else return false;}int dfs(int now, int t, int limit){ if(!limit || now == t) return limit; int flow = 0, f; for(int i = cur[now]; i != -1; i = e[i].next) { cur[now] = i; if(deep[e[i].to] == deep[now] + 1 && (f = dfs(e[i].to, t, min(limit, e[i].len)))) { flow += f; limit -= f; e[i].len -= f; e[i^1].len += f; if(!limit) break; } } return flow;}void Dinic(int s, int t){ while(bfs(s, t)) maxflow += dfs(s, t, inf);}int main(){ memset(head, -1, sizeof(head)); scanf("%d%d",&n,&s); t = 1 + n; for(int i = 1; i < n; i++) { int u, v, w; scanf("%d%d%d",&u,&v,&w); add(u, v, w, 1); add(v, u, w, 0); add(v, u, w, 1); add(u, v, w, 0); isleaf[u]++, isleaf[v]++; } for(int i = 1; i <= n; i++) { if(isleaf[i] == 1 && i != s) add(i, t, inf, 1), add(t, i, inf, 0), add(i, t, inf, 0), add(t, i, inf, 1); } Dinic(s, t); printf("%d\n",maxflow); return 0;}

转载于:https://www.cnblogs.com/MisakaAzusa/p/9431106.html

你可能感兴趣的文章
学习微软 Excel 2002 VBA 编程和XML,ASP技术
查看>>
游戏开发常用算法
查看>>
Real-Time Rendering 笔记
查看>>
如何理解HTML结构的语义化
查看>>
Intellij IDEA(eclipse设置)常用快捷键
查看>>
深入理解Java:注解(Annotation)基本概念
查看>>
NAT基本原理
查看>>
Java Content Repository API 简介 转自(https://www.ibm.com/developerworks/cn/java/j-jcr/)
查看>>
visio二次开发——图纸解析
查看>>
Activity之间的跳转:
查看>>
iTunes Connect 开发者上手经验(转)
查看>>
vertical-align你为什么不生效
查看>>
C++ 实践总结
查看>>
composer 国内镜像配置
查看>>
软件是天时、地利、人和的产物!
查看>>
python定时清空本目录下除本脚本外的全部文件
查看>>
【PHP】在目标字符串指定位置插入字符串
查看>>
【JS】jQuery设置定时器,访问服务器(PHP示例)配合微信、支付宝原生支付,跳转web网页...
查看>>
实验四2
查看>>
VS2012+Win7网站发布详细步骤
查看>>