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;
}