Nowcoder contest 370F Rinne Loves Edges (简单树形DP) || 【最大流】(模板)
<题目链接>
题目大意:
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int N = 1e5+;
struct Edge{int to;ll w;};
vector<Edge>G[N];
int n,m,s;
ll cost[N]; void dfs(int u,int fa){
if(G[u].size()== && u!=s) //叶子节点的权值置为无穷
cost[u]=1e18;
for(int i=;i<G[u].size();i++){
int v=G[u][i].to;
if(v==fa)continue;
dfs(v,u);
cost[u]+=min(cost[v],G[u][i].w); //就是要删除以v为根的子树中的叶子所有叶子节点的最小代价
}
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=m;i++){
int u,v;ll w;scanf("%d%d%lld",&u,&v,&w);
G[u].push_back(Edge{v,w});
G[v].push_back(Edge{u,w});
}
dfs(s,);
printf("%lld\n",cost[s]);
}
#include <bits/stdc++.h>
using namespace std; typedef long long ll; const int N = 1e5+;
const ll INF = 1e18; int n, m, S;
int deg[N]; struct Dinic
{
struct edge{ int from,to;ll cap,flow; }; //cap-flow才是这条边的真实流量
vector<edge>es;
vector<int>G[N];
bool vis[N];
int dist[N],iter[N];
void init(int n){
for(int i=; i<=n+; i++)G[i].clear();
es.clear();
}
void addedge(int from,int to,ll cap){
es.push_back((edge){from,to,cap,}); //将边存储的边表
es.push_back((edge){to,from,,});
int x=es.size();
G[from].push_back(x-); //G[u][i]记录以u为顶点的第i条边的反边在es中的编号
G[to].push_back(x-);
}
bool BFS(int s,int t){ //bfs将该图划分成分层图
memset(vis,,sizeof(vis));
queue <int> q;
vis[s]=;
dist[s]=;
q.push(s);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=; i<G[u].size(); i++){
edge &e=es[G[u][i]];
if(!vis[e.to]&&e.cap>e.flow){
vis[e.to]=;
dist[e.to]=dist[u]+;
q.push(e.to);
}
}
}
return vis[t];
}
int DFS(int u,int t,ll f){
if(u==t||f==)return f;
int nowflow=,d;
for(int &i=iter[u]; i<G[u].size(); i++){
edge &e=es[G[u][i]];
if(dist[u]+==dist[e.to]&&(d=DFS(e.to,t,min(f,e.cap-e.flow)))>){
e.flow+=d; //正边真实流量-d
es[G[u][i]^].flow-=d; //反边真实流量+d
nowflow+=d; //得到现在搜得的能够流入汇点的流量
f-=d; //找到一条增广路之后,减去这条路的流量,然后继续从这个顶点的其它边开始寻找增广路
if(f==)break;
}
}
return nowflow;
}
int Maxflow(int s,int t){
int flow=;
while(BFS(s,t)){
memset(iter,,sizeof(iter));
int d=;
while(d=DFS(s,t,INF))flow+=d;
}
return flow;
}
}dinic; void Get_Graph(){
scanf("%d %d %d", &n, &m, &S);
for (int i = ; i <= m; ++i) {
int u, v; ll w;
scanf("%d %d %lld", &u, &v, &w);
deg[u]++; deg[v]++;
dinic.addedge(u, v, w); dinic.addedge(v, u, w);
} for (int i = ; i <= n; ++i)
if (deg[i] == && i != S) dinic.addedge(, i, INF); //建一个超级源点,流向所有度数为1的点(除s以外)
} int main(){
Get_Graph();
cout<<dinic.Maxflow(,S)<<endl;
}
能够记录边的容量
#include <bits/stdc++.h>
using namespace std; typedef long long ll; const int N = + ;
const ll INF = 1e18;
int n, m, S;
int deg[N]; struct edge {
int to, rev; ll cap;
edge(int _to, ll _cap, int _rev) { to = _to, cap = _cap, rev = _rev; }
};
vector<edge> G[N]; inline void add_edge(int from, int to, ll cap) {
G[from].push_back(edge(to, cap, G[to].size()));
G[to].push_back(edge(from, , G[from].size() - ));
} void init() {
scanf("%d %d %d", &n, &m, &S);
for (int i = ; i <= m; ++i) {
int u, v; ll w;
scanf("%d %d %lld", &u, &v, &w);
deg[u]++; deg[v]++;
add_edge(u, v, w); add_edge(v, u, w);
} for (int i = ; i <= n; ++i)
if (deg[i] == && i != S) add_edge(, i, INF); //建一个超级源点,流向所有度数为1的点(除s以外)
} struct Dinic {
int level[N], iter[N];
queue <int> que; inline void bfs(int s) {
memset(level, -, sizeof level);
level[s] = ; //将图划分为层次图
que.push(s); while (!que.empty()) {
int u = que.front(); que.pop();
for (int i = ; i < G[u].size(); ++i) {
edge &e = G[u][i];
if (e.cap > && level[e.to] < ) {
level[e.to] = level[u] + ;
que.push(e.to);
}
}
}
} ll dfs(int u, int t, ll f) {
if (u == t) return f; for (int &i = iter[u]; i < G[u].size(); ++i) {
edge &e = G[u][i];
if (e.cap > && level[e.to] > level[u]) {
ll d = dfs(e.to, t, min(f, e.cap));
if (d > ) {
e.cap -= d;
G[e.to][e.rev].cap += d;
return d;
}
}
}
return ;
} ll max_flow(int s, int t) {
ll flow = ;
for (;;) {
memset(iter, , sizeof iter);
bfs(s);
if (level[t] < ) return flow;
ll f;
while ((f = dfs(s, t, INF)) > ) flow += f;
}
}
}dinic; int main() {
init();
cout << dinic.max_flow(, S) << endl; //S为汇点
}
不能记录边的容量
Nowcoder contest 370F Rinne Loves Edges (简单树形DP) || 【最大流】(模板)的更多相关文章
- Nowcoder contest 370H Rinne Loves Dynamic Graph【分层图最短路】
<题目链接> 题目大意:Rinne 学到了一个新的奇妙的东西叫做动态图,这里的动态图的定义是边权可以随着操作而变动的图.当我们在这个图上经过一条边的时候,这个图上所有边的边权都会发生变动. ...
- Nowcoder contest 370B Rinne Loves Graph 【分层图最短路】
<题目链接> 题目大意: Island 是有一些奇怪的城镇和道路构成的(题目需要,游戏党勿喷),有些城镇之间用双向道路连接起来了,且每条道路有它自己的距离.但是有一些城镇已经被派兵戒严,虽 ...
- poj 2342 Anniversary party 简单树形dp
Anniversary party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3862 Accepted: 2171 ...
- hdu 1520Anniversary party(简单树形dp)
Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu4705 Y 简单树形DP 2013多校训练第十场 J题
题意:求一棵树中不在一条链中的三个点的对数. 转化一下,用总对数减去在一条链上的三点对数即可. 考虑经过根节点,然后可能是不同的子树中各选一个:或者是子树中选一个,然后当前节点为根的子树以外的节点选一 ...
- HDU 4705 Y (2013多校10,1010题,简单树形DP)
Y Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...
- [10.27_P2] 统计损失 (简单树形DP)
树形DP 简单题 Description 给定一棵树,每个节点有一个值.对于一条路径,它的值为路径上所有点的值的乘积.求出树上所有路径的值的和. 注意:单个点也算一条路径. Input 第 1 行一个 ...
- hdu 1054 Strategic Game (简单树形DP)
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- [Luogu P1122]最大子树和 (简单树形DP)
题面 传送门:https://www.luogu.org/problemnew/show/P1122 Solution 这是一道简单的树形DP题. 首先,我们可以转换一下题面,可以发现,题目要求我们求 ...
随机推荐
- STM32L476应用开发之二:模拟量数据采集
采集模拟量数据在一台一起中是必不可少的功能.在本次实验中我们要采集的模拟量值主要包括氧气传感器的输出以及压力变送器的输出. 1硬件设计 我们需要采集数据对精度有一定的要求,而STM32L476自带AD ...
- Vmware Workstation _linux yum 仓库搭建
0:检查 vm虚拟机光盘是否已经连接 1. 检测yum 仓库是否已经配置好 [root@oracle ~]# yum list all 如果输入这条指令可以正确显示出rpm 包的列表,则说明yum 仓 ...
- web前端识别文字转语音
const msg = new SpeechSynthesisUtterance("hello world"); window.speechSynthesis.speak(msg) ...
- ctrl + alt + T无法启动终端
kill -9 -1重新进入即可
- 高性能JavaScript读后感
这本书让lz对js性能优化有了更深刻的理解,现在因为我们通常用第三方构建工具webpack.gulp等诸如此类,之前总是听说什么dom操作影响性能呢,对这个概念总是有点模糊,但看完这本书之后后,相对而 ...
- SpringCloud简介
1.什么是微服务? 微服务就是不同的模块部署在不同的服务器上面,通过接口去访问就是微服务 作用:利用分布式解决网站高并发带来的问题 2.什么是集群? 多台服务器部署相同应用构成一个集群 作用:通过负载 ...
- LeetCode(95): 不同的二叉搜索树 II
Medium! 题目描述: 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], ...
- Op-level的快速算法
十岁的小男孩 本文为终端移植的一个小章节. 目录 引言 FFT Conv2d (7x7, 9x9) Winograd Conv2d (3x3, 5x5) 引言 本节针对CNN进行加速计算的,主要有以下 ...
- 基于Web的漏洞利用
1.Nikto 基于Web的漏洞信息扫描 nikto 自动扫描web服务器上没有打补丁的软件,同时同时也检测驻留在服务器上的危险文件,nikto能够识别出特定的问题,检测服务器的配置问题, 检测某台主 ...
- 常用ajax样例
---恢复内容开始--- // url(String):请求地址 // param(String):请求参数 // targetId(String):结果显示id function ajaxReq(u ...