結果
| 問題 |
No.556 仁義なきサルたち
|
| コンテスト | |
| ユーザー |
puni_kyopro
|
| 提出日時 | 2018-12-02 14:27:37 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,327 bytes |
| コンパイル時間 | 593 ms |
| コンパイル使用メモリ | 71,592 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-06-28 18:20:53 |
| 合計ジャッジ時間 | 1,468 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 WA * 1 |
ソースコード
#include<iostream>
#include<vector>
#include<algorithm>
#include<cctype>
#include<utility>
#include<string>
#include<cstring>
#include<cmath>
#include<numeric>
#include<queue>
#include<climits>
#include<cstdio>
#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define FORR(i, m, n) for(int i = m;i >= n;i--)
#define SORT(v, n) sort(v, v+n);
#define VSORT(v) sort(v.begin(), v.end());
#define llong long long
#define pb(a) push_back(a)
//#define INF ((LLONG_MAX) / (2))
using namespace std;
typedef pair<int, int> P;
typedef pair<llong, llong> LP;
typedef pair<int, P> PP;
typedef pair<llong, LP> LPP;
typedef long long int ll;
typedef pair<ll,int> LL_IP;
typedef pair<ll,ll> LL_LLP;
#define INF 1e9+7
typedef struct union_find{
vector<int> pa;//親
vector<int> num;//根についている個数
//n要素で初期化
void init(int n){
pa.resize(n);
num.resize(n);
for(int i = 0;i < n;i++){
pa[i] = i;/*各ノードに番号を振る,この時par[x]=xとなる時は木の根となる*/
num[i] = 1;
}
}
//木の根を求める
int find(int x){
if(pa[x] == x){
return x;/*根ならそのノードの番号を返す*/
}else{
return pa[x] = find(pa[x]);/*根でないならさらにノードの根を探す*/
}
}
//xとyの属する集合を併合する
void unite(int x,int y){
x = find(x);//xの根の番号を探す
y = find(y);//yの根の番号を探す
if(x == y){//一致すればつながっている
return;
}
if(num[x] < num[y]){//xの個数が小さいなら大きい方につなぐ、そして繋がっている個数は2つの和になる
pa[x] = y;
num[y] += num[x];
}else{
pa[y] = x;//yの個数が小さいなら高いほうにつなぐ、そして繋がっている個数は2つの和になる
num[x] += num[y];
}
}
//xとyが同じ集合に属するか判定
bool same(int x,int y){
return find(x) == find(y);//同じ集合なら1、違うなら0が返る
}
}UF;
UF tree;
int main(){
int n,m;
cin >> n >> m;
tree.init(n);
int a,b;
REP(i,m){
cin >> a >> b;
a--;
b--;
if(tree.pa[a] != tree.pa[b]){
//ボスが違う場合
if(tree.num[tree.pa[a]] < tree.num[tree.pa[b]]){
//親の個数が大きい方につなぐ
tree.unite(tree.pa[b],tree.pa[a]);
}else if(tree.num[tree.pa[a]] > tree.num[tree.pa[b]]){
tree.unite(tree.pa[a],tree.pa[b]);
}else{
//親の個数が同じ場合
if(tree.pa[a] < tree.pa[b]){
//1位に近いほうにつなぐ
tree.unite(tree.pa[a],tree.pa[b]);
}else{
tree.unite(tree.pa[b],tree.pa[a]);
}
}
}
//ボスが同じなら何もしない
}
/*REP(i,n){
cout << tree.num[i] << " ";
}
cout << endl;*/
REP(i,n){
cout << tree.find(i)+1 << endl;
}
return 0;
}
puni_kyopro