找朋友 |
难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
试题描述 |
现在有N个人在找朋友。如果a和b是朋友,b和c是朋友,那么a和c也是朋友。XJR是所有人的朋友(人缘好吧),知道M个信息,每次知道一对朋友。那么请你回答每个人有多少朋友呢? |
输入 |
第一行,两个数N(N<=100000)、M,分别表示有多少人以及XJR所知道的信息的数量。接下来M行,每行有两个不同的数x(1<=x<=N)、y(1<=y<=N),表示x与y是朋友。 |
输出 |
输出N行,第i行为i的朋友数。 |
输入示例 |
5 4 1 3 1 2 2 3 5 4 |
输出示例 |
3 3 3 2 2 |
直接用并查集,记着别忘了答案别忘了加1(仔细看题)。
#include<iostream> #include<cstdio> using namespace std; int n,m,pre[100001],ans[100001]; int find(int a) { int t=a; if(pre[t]!=t) pre[t]=find(pre[t]); return pre[t]; } void join(int a,int b) { int x=find(a),y=find(b); pre[x]=y; } int main() { int a,b; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) pre[i]=i; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); //cout<<pre[a]<<" "<<pre[b]<<endl; join(a,b); } //cout<<"_______"<<endl; for(int i=1;i<=n;i++) ans[find(i)]++; for(int i=1;i<=n;i++) printf("%d\n",ans[find(i)]); //system("pause"); return 0; }
时间: 2024-10-02 14:50:23