結果
| 問題 |
No.556 仁義なきサルたち
|
| コンテスト | |
| ユーザー |
momoyuu
|
| 提出日時 | 2022-08-24 02:18:29 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 8 ms / 2,000 ms |
| コード長 | 1,727 bytes |
| コンパイル時間 | 3,195 ms |
| コンパイル使用メモリ | 248,888 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-10-11 08:03:29 |
| 合計ジャッジ時間 | 4,238 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 22 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
template<class t> using vc = vector<t>;
template<class t> using vvc = vc<vc<t>>;
using pi = pair<int,int>;
using vi = vc<int>;
using vvi = vvc<int>;
#define rep(i,a,b) for (int i = a; i < b; i++)
#define irep(i,a,b) for (int i = a; i > b; i--)
#define print(n) cout << n << '\n'
#define pritn(n) print(n)
#define rup(a,b) (a+b-1)/b
#define input(A,N) rep(i,0,N) cin>>A[i];
struct unionfind{
int n;
vector<int> parent;
vector<int> num;
unionfind(int n){
this->n = n;
parent = vector<int>(n);
for(int i = 0; i < n; i++) parent[i] = i;
num = vector<int>(n);
for(int i = 0; i < n; i++) num[i] = 1;
}
int find(int n){
if (parent[n] == n) return n;
parent[n] = this->find(parent[n]);
return parent[n];
}
int merge(int n,int m){
n = this->find(n);
m = this->find(m);
if (n==m) return n;
parent[m] = n;
num[n] += num[m];
return n;
}
int getnum(int n){
return num[this->find(n)];
}
};
int main(){
cout << fixed << setprecision(15);
int n,m;
cin >> n >> m;
unionfind u(n);
rep(i,0,m){
int a,b;
cin >> a >> b;
a--;b--;
a = u.find(a);
b = u.find(b);
if (a == b) continue;
if (u.getnum(a)>u.getnum(b)) u.merge(a,b);
else if(u.getnum(b)>u.getnum(a)) u.merge(b,a);
else{
if(a<b) u.merge(a,b);
else u.merge(b,a);
}
}
rep(i,0,n){
print(u.find(i)+1);
}
//system("pause");
return 0;
}
momoyuu