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题. 首先,我们可以转换一下题面,可以发现,题目要求我们求 ...
随机推荐
- 尚硅谷《全套Java、Android、HTML5前端视频》
尚硅谷<全套Java.Android.HTML5前端视频> (百万谷粉推荐:史上最牛.最适合自学的全套视频.资料及源码) [尚硅谷官网资料导航] 谷粒学院在线学习:http://www.g ...
- Confluence 6 修改日志文件的大小数量和级别
修改日志文件的大小和数量 在默认的情况下,Confluence 将会保持 5 个日志文件,每一个日志文件的大小超过 20 MB 的时候将会被重写. 你可以修改默认日志文件的大小和数量,通过编辑 < ...
- Android UiAutomator
UiAutomator是一个做UI测试的自动化框架.<Android自动化测试框架>中已有详细介绍,这里就不再累赘了. 一.首先了解自动化测试流程 自动化需求分析 测试用例设计 自动化框架 ...
- 基于DBUtils实现数据库连接池
小知识: 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Anim ...
- Solver Of Caffe
本文旨在解决如何编写solver文件. Solver的流程: 1. 设计好需要优化的对象,以及用于学习的训练网络和用于评估的测试网络.(通过调用另外一个配置文件prototxt来进行) 2. ...
- 怎么编辑PDF,如何给PDF加水印
在使用PDF文件的时候,往往会用到PDF编辑器来修改,那么,在使用PDF编辑器修改文件的时候,想要在文件中添加水印,这该怎么操作呢,不会的小伙伴可以看看下面的文章了哦,说不定就会了. 1.打开运行PD ...
- vue中引入css文件
两种方式引入css文件,一种是直接在main.js中引入(也可以在其他的.vue文件中的<script></script>标签中),即下面这种写法: import 'eleme ...
- easyui 布局之window和panel一起使用时,拉动window宽高时panel不跟随一起变化
项目开发中布局是每一个组件都由最外层的window和内部的至少一个panel组成,其他的细小组件再依次放到panel中. 问题:当拉动外部的window时我们希望内部的panel的宽高也跟着变化,但是 ...
- selenium 操作键盘
send_keys(Keys.ENTER) 按下回车键send_keys(Keys.TAB) 按下Tab制表键send_keys(Keys.SPACE) 按下空格键spacesend_keys(Kye ...
- CentOS安装jdk的三种方法
方法一:手动解压JDK的压缩包,然后设置环境变量 方法二:用yum安装JDK,(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的 ...