社区讨论

吉吉国王,在线等(自己感觉很对)

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 条回复,欢迎继续交流。

正在加载回复...