[USACO15DEC]最大流
来源:互联网 发布:linux tftpd 编辑:程序博客网 时间:2024/06/03 16:38
[USACO15DEC]最大流
题目描述:
FJ给他的牛棚的N(2≤N≤50,000)个隔间之间安装了N-1根管道,隔间编号从1到N。所有隔间都被管道连通了。
FJ有K(1≤K≤100,000)条运输牛奶的路线,第i条路线从隔间si运输到隔间ti。一条运输路线会给它的两个端点处的隔间以及中间途径的所有隔间带来一个单位的运输压力,你需要计算压力最大的隔间的压力是多少。
输入样例#1:
5 10
3 4
1 5
4 2
5 4
5 4
5 4
3 5
4 3
4 3
1 3
3 5
5 4
1 5
3 4
输出样例#1:
9
题解:
树链剖分模板,没什么难的,模拟就可以了。
代码:
#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int max_n = 500010;const int inf = 1e9+7;struct node { int l,r; int delta;}tree[max_n];int top[max_n],fa[max_n],deep[max_n],size[max_n],rank_n[max_n],end_n[max_n];int point[max_n],nxt[max_n],v[max_n],val[max_n];int n,m,tot,x,y,root,ans=0;inline void init(){ tot=0; root=1; memset(point,-1,sizeof(point)); memset(nxt,-1,sizeof(nxt));}inline void pushdown(int now){ if(tree[now].delta) { tree[now<<1].delta+=tree[now].delta; tree[(now<<1)+1].delta+=tree[now].delta; tree[now].delta=0; }}inline void addedge(int x,int y){ ++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; ++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x;}inline void build(int now,int l,int r){ tree[now].l=l; tree[now].r=r; if(l==r) { return; } int mid=(l+r)>>1; build(now<<1,l,mid); build((now<<1)+1,mid+1,r);}inline void dfs1(int now,int f){ size[now]=1; deep[now]=deep[f]+1; fa[now]=f; for(int i=point[now]; i!=-1; i=nxt[i]) if(v[i]!=f) { dfs1(v[i],now); size[now]+=size[v[i]]; }} inline void dfs2(int now,int tip){ top[now]=tip; rank_n[now]=++tot; if(now!=root && nxt[point[now]]==-1) { end_n[now]=now; return; } int mson=0; for(int i=point[now]; i!=-1; i=nxt[i]) if(size[v[i]]<size[now] && size[v[i]]>size[mson]) mson=v[i]; dfs2(mson,tip); end_n[now]=end_n[mson]; for(int i=point[now]; i!=-1; i=nxt[i]) if(size[v[i]]<size[now] && v[i]!=mson) { dfs2(v[i],v[i]); end_n[now]=end_n[v[i]]; }}inline void change(int now,int l,int r){ int lr=tree[now].l,rr=tree[now].r; if(l<=lr && rr<=r) { tree[now].delta++; return; } int mid=(lr+rr)>>1; pushdown(now); if(l<=mid) change(now<<1,l,r); if(r>mid) change((now<<1)+1,l,r);}inline void schange(int x,int y){ while(top[x]!=top[y]) { if(deep[top[x]]<deep[top[y]]) swap(x,y); change(1,rank_n[top[x]],rank_n[x]); x=fa[top[x]]; } if(rank_n[x]>rank_n[y]) swap(x,y); change(1,rank_n[x],rank_n[y]);}inline void dfs(int now){ int lr=tree[now].l,rr=tree[now].r; if(lr==rr) { ans=max(tree[now].delta,ans); return; } pushdown(now); dfs(now<<1); dfs((now<<1)+1);}int main(){ scanf("%d%d",&n,&m); init(); for(int i=1; i<=n-1; ++i) { scanf("%d%d",&x,&y); addedge(x,y); } tot=0; build(1,1,n); dfs1(root,0); dfs2(root,root); for(int i=1; i<=m; ++i) { scanf("%d%d",&x,&y); schange(x,y); } dfs(root); printf("%d\n",ans); return 0;}
阅读全文
0 0
- [USACO15DEC]最大流
- [USACO15DEC]最大流Max Flow
- [USACO15DEC]最大流Max Flow
- 洛谷 P3128 [USACO15DEC]最大流Max Flow
- [USACO15DEC]最大流Max Flow题解
- 洛谷P3128 [USACO15DEC]最大流Max Flow
- 洛谷 P3128 [USACO15DEC] 最大流Max Flow
- 洛谷 P3128 [USACO15DEC]最大流Max Flow
- 洛谷P3128 [USACO15DEC]最大流Max Flow
- P3128 [USACO15DEC]最大流Max Flow
- 最大流-最大利益
- [USACO15DEC]高低卡(白金)High Card Low Card (Platinum)
- 最大流
- 最大流
- 最大流
- 最大流
- 最大流
- 最大流
- C#学习笔记——属性
- 常用html
- HttpURLConnection 以及其父类URLConnection 中的方法及静态常量
- javaScript--简单表单验证
- mysql tinyint和int数据类型的区别
- [USACO15DEC]最大流
- android_短信广播
- 跳马问题
- Js复习4
- css笔记
- BaseAnimation是基于开源的APP,致力于收集各种动画效果(最新版本1.3)
- Java 反射
- NYOJ士兵杀敌(二) 单点值修改加区域求和
- javaScript--算术内置对象