刷题记录表

No.6

2020-04-15

【题目】连通性统计

【思路】

省略……

【代码】

#include<bits/stdc++.h>
using namespace std;
inline int read(int &a){a=0;int f=1;char c=getchar();if(c==EOF) return a=EOF;
for(;c<'0' || c>'9';c=getchar()){if(c=='-') f=-1;if(c==EOF) return a=EOF;}
for(;c<='9' && c>='0';a=a*10+c-'0',c=getchar());return a*=f;}
int n,x,y;
struct tree{
	int next,ver;
} e[200010];
int head[200010],tot;
int fz1[200010],su1[200010],cnt;
int fz2[200010],su2[200010];
void add(int a,int b){e[++tot].next=head[a],head[a]=tot,e[tot].ver=b;
e[++tot].next=head[b],head[b]=tot,e[tot].ver=a;}
int ans[200010];

void dfs_x(int x,int z)
{
	fz1[x]=z;
	su1[z]++;
	for(int i=head[x];i;i=e[i].next)
	if(fz1[e[i].ver]==0) dfs_x(e[i].ver,z);
}

void dfs_y(int x,int z)
{
	fz2[x]=z;
	su2[z]++;
	for(int i=head[x];i;i=e[i].next)
	if(fz2[e[i].ver]==0) dfs_y(e[i].ver,z);
}
map<pair<int,int>,int> zuh;
pair<int,int> ii;

int main()
{
	freopen("link.in","r",stdin);
	freopen("link.out","w",stdout);
	read(n),read(x),read(y);
	for(int i=1;i<=x;i++)
	{
		int x1,x2;
		read(x1),read(x2);
		add(x1,x2);
	}
	for(int i=1;i<=n;i++)
	if(fz1[i]==0) cnt++,dfs_x(i,cnt);
	memset(e,0,sizeof(e));
	memset(head,0,sizeof(head));
	cnt=0,tot=0;
	for(int i=1;i<=y;i++)
	{
		int y1,y2;
		read(y1),read(y2);
		add(y1,y2);
	}
	for(int i=1;i<=n;i++)
	if(fz2[i]==0) cnt++,dfs_y(i,cnt);
//	for(int i=1;i<n;i++) printf("%d ",min(su1[fz1[i]],su2[fz2[i]]));
//	printf("%d\n",min(su1[fz1[n]],su2[fz2[n]]));
//	
//	for(int i=1;i<n;i++)
//	for(int j=i+1;j<=n;j++)
//	if(fz1[i]==fz1[j] && fz2[i]==fz2[j]) ans[i]++,ans[j]++;
//	for(int i=1;i<n;i++) printf("%d ",ans[i]+1);
//	printf("%d\n",ans[n]+1);
	for(int i=1;i<=n;i++)
	{
		ii=make_pair(fz1[i],fz2[i]);
		zuh[ii]++;
	}
	for(int i=1;i<n;i++)
	{
		ii=make_pair(fz1[i],fz2[i]);
		printf("%d ",zuh[ii]);
	}
	ii=make_pair(fz1[n],fz2[n]);
	printf("%d\n",zuh[ii]);
	return 0;
}

留下评论

通过 WordPress.com 设计一个这样的站点
从这里开始