社区讨论

二分图求 hack

AT_abc302_h [ABC302Ex] Ball Collector参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lz13rgj1
此快照首次捕获于
2024/07/25 18:00
2 年前
此快照最后确认于
2024/07/25 19:18
2 年前
查看原帖
rt
微改二分图,求卡。
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define fi first
#define se second
#define ps push_back
#define mk make_pair
#define rint register int
#define G cout<<"-------------------"<<endl
inline ll read(){
	char c=getchar();ll x=0,f=1;
	while(!isdigit(c))(c=='-'?f=-1:0),c=getchar();
	while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
const int N=1e6+10,inf=0x7fffffff;
const ll linf=0x3f7f7f7f7f7f7f7f,mod=1e9+7;
int n,m,ans,anss[N],cnt,hd[N],xuan[N],mac[N],dep[N];
struct jj{
	int fr,to,next;
}bi[N<<1];
pii dui[N];
inline void add(int x,int y){bi[++cnt]={x,y,hd[x]},hd[x]=cnt,bi[++cnt]={y,x,hd[y]},hd[y]=cnt;}
int vis[N],lun;
bool dfs(int x){
	if(!mac[dui[x].fi])return mac[dui[x].fi]=x,xuan[x]=dui[x].fi,1;
	if(!mac[dui[x].se])return mac[dui[x].se]=x,xuan[x]=dui[x].se,1;
	if(vis[dui[x].fi]!=lun){
		vis[dui[x].fi]=lun;
		if(dep[mac[dui[x].fi]]!=dep[x]&&dfs(mac[dui[x].fi]))return mac[dui[x].fi]=x,xuan[x]=dui[x].fi,1;
	}
	if(vis[dui[x].se]!=lun){
		if(dep[mac[dui[x].se]]!=dep[x]&&dfs(mac[dui[x].se]))return mac[dui[x].se]=x,xuan[x]=dui[x].se,1;
	}
	return 0;
}
inline void xly(int x,int fa){
	bool f=0;
	lun=x;
	if(dfs(x))++ans,f=1;
	anss[x]=ans;
	for(int i=hd[x];i;i=bi[i].next){
		int j=bi[i].to;
		if(j==fa)continue;
		xly(j,x);
	}
	if(f)--ans,mac[xuan[x]]=0;
}
inline void sao(int x,int fa){
	dep[x]=dep[fa]+1;
	for(int i=hd[x];i;i=bi[i].next){
		int j=bi[i].to;
		if(!dep[j])sao(j,x);
	}
}
int main(){
	n=read();
	for(int i=1;i<=n;++i)
		dui[i]={read(),read()};
	for(int i=1;i<n;++i)
		add(read(),read());
	sao(1,0);
	xly(1,0);
	for(int i=2;i<=n;++i)
		printf("%d ",anss[i]);
}

回复

1 条回复,欢迎继续交流。

正在加载回复...