社区讨论
吉吉国王,在线等(自己感觉很对)
P3128[USACO15DEC] Max Flow P参与者 8已保存回复 21
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 21 条
- 当前快照
- 1 份
- 快照标识符
- @lo2j6uft
- 此快照首次捕获于
- 2023/10/23 14:43 2 年前
- 此快照最后确认于
- 2023/10/23 14:43 2 年前
只有16分
小样例模了几个都是对的
大佬帮忙看看
急急急
CPP#include<bits/stdc++.h>
using namespace std;
int n,k,i,t,w,pp[300000],f[300000],maxx,cnt,head[300000],d[300000],p[300000][30];
bool ff[300000];
struct node{
int t,w,next;
}e[200000];
inline void add(int t,int w){
cnt++;
e[cnt].t=t;
e[cnt].w=w;
e[cnt].next=head[t];
head[t]=cnt;
}
inline void dfs(int u,int fa){
d[u]=d[fa]+1;
p[u][0]=fa;
for (int i=1;(1<<i)<=d[u];i++)
p[u][i]=p[p[u][i-1]][i-1];
for (int i=head[u];i;i=e[i].next){
int w=e[i].w;
if (w!=fa) dfs(w,u);
}
}
inline int lca(int a,int b){
if (d[a]>d[b]){
int c=a;
a=b;
b=c;
}
for (int i=20;i>=0;i--)
if (d[a]<=d[b]-(1<<i)) b=p[b][i];
if (a==b) return a;
for (int i=20;i>=0;i--){
if (p[a][i]==p[b][i]) continue;
else a=p[a][i],b=p[b][i];
}
return p[a][0];
}
int main(){
scanf("%d %d",&n,&k);
for (i=1;i<n;i++){
scanf("%d %d",&t,&w);
add(t,w);
add(w,t);
}
dfs(1,0);
for (i=1;i<=k;i++){
scanf("%d %d",&t,&w);
int l=lca(t,w);
f[l]+=1;
if (l==t){
for (int j=head[w];j;j=e[j].next)
if (d[e[j].w]>d[w]) f[e[j].w]--;
for (int j=head[t];j;j=e[j].next)
if (lca(e[j].w,w)!=e[j].w&&d[e[j].w]>d[t]) f[e[j].w]--;
}
else if (w==l){
for (int j=head[w];j;j=e[j].next)
if (lca(e[j].w,t)!=e[j].w&&d[e[j].w]>d[w]) f[e[j].w]--;
for (int j=head[t];j;j=e[j].next)
if (d[e[j].w]>d[t]) f[e[j].w]--;
}
else{
for (int j=head[w];j;j=e[j].next)
if (d[e[j].w]>d[w]) f[e[j].w]--;
for (int j=head[t];j;j=e[j].next)
if (d[e[j].w]>d[t]) f[e[j].w]--;
}
}
memset(ff,true,sizeof(ff));
t=w=1;
pp[1]=1;
ff[1]=false;
while (t<=w){
for (i=head[pp[t]];i;i=e[i].next)
if (ff[e[i].w]){
w++;
ff[e[i].w]=false;
pp[w]=e[i].w;
f[e[i].w]+=f[pp[t]];
maxx=max(maxx,f[e[i].w]);
}
t++;
}
printf("%d\n",maxx);
return 0;
}
回复
共 21 条回复,欢迎继续交流。
正在加载回复...