結果
| 問題 |
No.812 Change of Class
|
| コンテスト | |
| ユーザー |
mhrb_minase
|
| 提出日時 | 2019-04-12 22:38:03 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,066 bytes |
| コンパイル時間 | 1,565 ms |
| コンパイル使用メモリ | 180,132 KB |
| 実行使用メモリ | 10,180 KB |
| 最終ジャッジ日時 | 2024-06-12 19:28:01 |
| 合計ジャッジ時間 | 6,080 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 WA * 48 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define lint long long
#define P pair<int, int>
#define LLP pair<long long, long long>
#define REP(i, x, n) for(int i = (x), i##_len = (int)(n) ; i < i##_len ; ++i)
#define rep(i, n) for(int i = 0, i##_len = (int)(n) ; i < i##_len ; ++i)
#define reps(i, n) for(int i = 1, i##_len = (int)(n) ; i <= i##_len ; ++i)
#define rrep(i, n) for(int i = (int)(n) - 1 ; i >= 0 ; --i)
#define rreps(i, n) for(int i = (int)(n) ; i > 0 ; --i)
#define SORT(x) sort((x).begin(), (x).end())
#define SORT_INV(x) sort((x).rbegin(), (x).rend())
const int IINF = (1 << 30) - 1;
const long long LLINF = 1LL << 61;
const long long MOD = 1000000007LL;
const int dx4[] = {1, 0, -1, 0}, dy4[] = {0, 1, 0, -1};
const int dx8[] = {1, 1, 0, -1, -1, -1, 0, 1}, dy8[] = {0, -1, -1, -1, 0, 1, 1, 1};
const double EPS = 1e-8;
struct unionFind{
vector<int> par;
int siz;
void init(int N){
par.resize(N);
fill(par.begin(), par.end(), -1);
siz = N;
return;
}
int root(int X){
if(par[X] < 0){
return X;
}
return par[X] = root(par[X]);
}
bool unite(int X, int Y){
X = root(X);
Y = root(Y);
if(X == Y){
return false;
}
if(par[X] < par[Y]){
swap(X, Y);
}
par[Y] += par[X];
par[X] = Y;
--siz;
return true;
}
bool same(int X, int Y){
return root(X) == root(Y);
}
int size(int X){
return -par[root(X)];
}
};
template<typename T>
bool chmin(T &_a, T _b){
if(_a > _b){
_a = _b;
return true;
}else{
return false;
}
}
template<typename T>
bool chmax(T &_a, T _b){
if(_a < _b){
_a = _b;
return true;
}else{
return false;
}
}
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
int n, m;
cin >> n >> m;
unionFind uf;
uf.init(n);
vector< vector<int> > g(n);
rep(i, m){
int p, q;
cin >> p >> q;
--p;
--q;
uf.unite(p, q);
g[p].emplace_back(q);
g[q].emplace_back(p);
}
int q;
cin >> q;
rep(I, q){
int a;
cin >> a;
--a;
vector<int> cost(n, IINF);
queue< P > que;
que.push({a, 0});
while(!que.empty()){
P now = que.front();
que.pop();
if(!chmin(cost[now.first], now.second)){
continue;
}
for(auto x : g[now.first]){
if(cost[x] > now.second + 1){
que.push({x, now.second + 1});
}
}
}
int maxi = 0;
rep(i, n){
if(uf.same(i, a)){
chmax(maxi, cost[i]);
}
}
int ans1 = uf.size(a) - 1, ans2 = 0;
if(maxi <= 1){
ans2 = 0;
}else{
ans2 = (maxi - 1) / 2 + 1;
}
cout << ans1 << " " << ans2 << endl;
}
return 0;
}
mhrb_minase