結果
| 問題 |
No.556 仁義なきサルたち
|
| コンテスト | |
| ユーザー |
ojisan_IT
|
| 提出日時 | 2017-08-17 19:45:56 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,783 bytes |
| コンパイル時間 | 1,452 ms |
| コンパイル使用メモリ | 168,288 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-10-14 13:55:14 |
| 合計ジャッジ時間 | 5,178 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | RE * 22 |
コンパイルメッセージ
main.cpp: In member function 'int UF::merge(int, int)':
main.cpp:44:19: warning: control reaches end of non-void function [-Wreturn-type]
44 | over[root(b)] = root(a);
| ~~~~~~~~~~~~~~^~~~~~~~~
ソースコード
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
#define rep(i,n) for(ll i=0;i<(n);i++)
#define pii pair<int,int>
#define piii pair<int,pii>
#define mp make_pair
#define pb push_back
#define ALL(a) (a).begin(),(a).end()
#define FST first
#define SEC second
const int INF = (INT_MAX/2);
const ll LLINF = (LLONG_MAX/2);
const double eps = 1e-5;
const double PI = M_PI;
#define DEB cout<<"!"<<endl
#define SHOW(a,b) cout<<(a)<<" "<<(b)<<endl
#define SHOWARRAY(ar,i,j) REP(a,i)REP(b,j)cout<<ar[a][b]<<((b==j-1)?((a==i-1)?("\n\n"):("\n")):(" "))
#define DIV 1000000007
typedef vector<ll> Array;
typedef vector<Array> matrix;
typedef tuple<int,int,int> tiii;
#define mt make_tuple
#define Nodes 10000
class UF{
public:
int value[Nodes];
int over[Nodes]; // When over < 0, 'over' keep elements of node(using negative number). -1 means this tree is a node.
int root(int index){
int t = index;
while(over[t] >= 0)
t = over[t];
if(index!=t)over[index] = t;
return t;
}
int merge(int a,int b){
if(this->root(a) == this->root(b)) return false;
over[root(a)] += over[root(b)];
over[root(b)] = root(a);
}
UF(){rep(i,Nodes) over[i] = -1;}
};
int main(){
UF u;
rep(i,Nodes)
u.value[i] = i;
int n,m; cin >> n >> m;
rep(i,m){
int a,b; cin >> a >> b;
a--; b--;
if(u.root(a) == u.root(b)) continue;
int a_root = u.root(a); int b_root = u.root(b);
if(u.over[a_root] < u.over[b_root])
u.merge(a_root,b_root);
else if(u.over[a_root] > u.over[b_root])
u.merge(b_root,a_root);
else if(a_root < b_root)
u.merge(a_root,b_root);
else
u.merge(b_root,a_root);
}
rep(i,n)
cout << u.root(i)+1 << endl;
}
ojisan_IT