結果
| 問題 |
No.2948 move move rotti
|
| コンテスト | |
| ユーザー |
keisuke6
|
| 提出日時 | 2024-10-25 23:09:03 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,367 bytes |
| コンパイル時間 | 2,903 ms |
| コンパイル使用メモリ | 204,724 KB |
| 最終ジャッジ日時 | 2025-02-24 23:52:24 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 WA * 8 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct Unionfind{
vector<int> par, siz;
//初期化
Unionfind(int n) : par(n,-1) , siz(n,1) {}
int root(int x) {
if(par[x] == -1) return x;
else return par[x] = root(par[x]);
}
bool issame(int x,int y) {
return root(x) == root(y);
}
bool unite(int x, int y){
x = root(x); y = root(y);
if(x == y) return false;
if(siz[x] < siz[y]) swap(x,y);
par[y] = x;
siz[x] += siz[y];
return true;
}
int size(int x) {
return siz[root(x)];
}
};
signed main(){
int N,M,K;
cin>>N>>M>>K;
vector<int> S(K);
Unionfind uff(N);
for(int i=0;i<K;i++){
cin>>S[i];
S[i]--;
}
vector<vector<int>> G(N);
for(int i=0;i<M;i++){
int a,b;
cin>>a>>b;
a--;
b--;
G[a].push_back(b);
G[b].push_back(a);
uff.unite(a,b);
}
Unionfind uf(N*N);
for(int i=0;i<N;i++)for(int j=0;j<N;j++){
uf.unite(i*N+j,j*N+i);
for(int x:G[i])for(int y:G[j]) uf.unite(i*N+j,x*N+y);
}
for(int i=0;i<K;i++)for(int j=0;j<K;j++){
if(!uff.issame(S[i],S[j])){
cout<<"No"<<endl;
return 0;
}
bool ok = false;
for(int k=0;k<N;k++)if(uf.issame(k*N+k,S[i]*N+S[j])) ok = true;
if(!ok){
cout<<"No"<<endl;
return 0;
}
}
cout<<"Yes"<<endl;
}
keisuke6