Farmer John has installed a new system of N−1 pipes to transport milk between the N stalls in his barn (2≤N≤50,000), conveniently numbered 1…N. Each pipe connects a pair of stalls, and all stalls are connected to each-other via paths of pipes.
FJ is pumping milk between K pairs of stalls (1≤K≤100,000). For the ith such pair, you are told two stalls si and ti, endpoints of a path along which milk is being pumped at a unit rate. FJ is concerned that some stalls might end up overwhelmed with all the milk being pumped through them, since a stall can serve as a waypoint along many of the K paths along which milk is being pumped. Please help him determine the maximum amount of milk being pumped through any stall. If milk is being pumped along a path from si to ti, then it counts as being pumped through the endpoint stalls si and
ti, as well as through every stall along the path between them.
FJ给他的牛棚的N(2≤N≤50,000)个隔间之间安装了N-1根管道,隔间编号从1到N。所有隔间都被管道连通了。
FJ有K(1≤K≤100,000)条运输牛奶的路线,第i条路线从隔间si运输到隔间ti。一条运输路线会给它的两个端点处的隔间以及中间途径的所有隔间带来一个单位的运输压力,你需要计算压力最大的隔间的压力是多少。
输入输出格式
输入格式:
The first line of the input contains N and K.
The next N−1 lines each contain two integers x and y (x≠y) describing a pipe
between stalls x and y.
The next K lines each contain two integers s and t describing the endpoint
stalls of a path through which milk is being pumped.
输出格式:
An integer specifying the maximum amount of milk pumped through any stall in the
barn.
LCA + 差分
输入输出样例
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#include<cstdio> #define ll long long #include<algorithm> #define MAXN 100050 using namespace std; int n,m; struct node{ int from,to,next; }edge[MAXN]; int head[MAXN],cnt; int f[MAXN][26]; int dep[MAXN]; int d[MAXN]; int lca(int x,int y) { int re; if (dep[x]<dep[y]) { swap(x,y); } for (int i=16;i>-1;i--) { if (dep[f[x][i]]>=dep[y]) { x=f[x][i]; } } if (x==y) return x; for (int i=16;i>-1;i--) { if (f[x][i]!=f[y][i]) { x=f[x][i]; y=f[y][i]; } else re=f[x][i]; } return re; } void add(int x,int y) { edge[++cnt].from=x; edge[cnt].to=y; edge[cnt].next=head[x]; head[x]=cnt; } void init() { for (int j=1;j<=16;j++) { for (int i=1;i<=n;i++) { f[i][j]=f[f[i][j-1]][j-1]; } } } void dfs(int x,int fa) { for (int i=head[x];i;i=edge[i].next) { int to=edge[i].to; if (to==fa) continue; dep[to]=dep[x]+1; f[to][0]=x; dfs(to,x); d[x]+=d[to]; } } int main() { scanf("%d%d",&n,&m); for (int i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); add(x,y); add(y,x); } f[1][0]=1; dep[1]=1; dfs(1,1); init(); for (int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); int k=lca(x,y); d[k]--; d[f[k][0]]--; d[x]++,d[y]++; } dfs(1,0); int ans=0; for (int i=1;i<=n;i++) { ans=max(d[i],ans); } printf("%d\n",ans); return 0; }
9