結果
| 問題 | No.1488 Max Score of the Tree |
| コンテスト | |
| ユーザー |
maguro
|
| 提出日時 | 2021-04-06 11:57:08 |
| 言語 | C++17(gcc12) (gcc 12.4.0 + boost 1.90.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,725 bytes |
| 記録 | |
| コンパイル時間 | 5,838 ms |
| コンパイル使用メモリ | 336,460 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-06-19 13:01:39 |
| 合計ジャッジ時間 | 7,029 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
| other | WA * 29 |
ソースコード
#include<bits/stdc++.h>
#include "testlib.h"
using namespace std;
struct Union_find {
vector<int> par; //親
vector<int> siz; //根ノードiの木に含まれる要素数。iが根ノード出ない場合無意味な値となる。
//n要素で初期化
Union_find(int n) {
par.resize(n);
siz.resize(n);
for(int i = 0;i < n;i++) {
par[i] = i;
siz[i] = 1;
}
}
//木の根を求める
int find(int x) {
if(par[x] == x) {
return x;
}
else {
return par[x] = find(par[x]);
}
}
//xとyの属する集合を併合
void unite(int x,int y) {
x = find(x);
y = find(y);
if(x == y) {
return;
}
if(siz[x] < siz[y]) {
swap(x,y);
}
par[y] = x;
siz[x] += siz[y];
}
//xとyが同じ集合に属するか否か
bool same(int x,int y) {
return find(x) == find(y);
}
int size(int x) {
return siz[find(x)];
}
};
//A,空白,B,改行の順に読み込み(1 <= A,B <= 100)
int main(int argc,char* argv[]) {
registerValidation(argc,argv);
int N = inf.readInt(2,100,"N");
inf.readSpace();
int K = inf.readInt(1,100000,"K");
inf.readEoln();
set<pair<int,int>> edges;
Union_find uf(N + 1);
for(int i = 0;i < N - 1;i++) {
int a = inf.readInt(1,N);
inf.readSpace();
int b = inf.readInt(1,N);
inf.readSpace();
int c = inf.readInt(1,K);
inf.readEoln();
ensuref(a != b,"Tree can't contain loops");
ensuref(!edges.count({a,b}),"Tree can't contain multiple edges between a pair of vertices");
edges.insert({a,b});
edges.insert({b,a});
ensuref(!uf.same(a,b),"Tree can't contain cycles");
uf.unite(a,b);
}
inf.readEof();
return 0;
}
maguro