結果
| 問題 |
No.922 東北きりきざむたん
|
| コンテスト | |
| ユーザー |
pockyny
|
| 提出日時 | 2019-11-08 22:13:37 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,154 bytes |
| コンパイル時間 | 1,077 ms |
| コンパイル使用メモリ | 83,536 KB |
| 最終ジャッジ日時 | 2025-01-08 02:34:47 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 8 WA * 18 |
ソースコード
#include <iostream>
#include <vector>
#include <set>
using namespace std;
const int LOG = 22;
vector<int> G[100010],ver[100010];
int parent[25][100010];
int d[100010];
void dfs(int v, int p){
for(int x:G[v]){
if(x==p) continue;
parent[0][x] = v;
d[x] = d[v] + 1;
dfs(x,v);
}
}
void init(int v,int root){
d[root] = 0; parent[0][root] = -1;
dfs(root,-1);
for(int k=0;k+1<LOG;k++){
for(int i:ver[v]){
if(parent[k][i]<0){
parent[k+1][i] = -1;
}else{
parent[k+1][i] = parent[k][parent[k][i]];
}
}
}
}
int lca(int u, int v){
if(d[u]>d[v]) swap(u,v);
for(int k = 0;k<LOG;k++){
if((d[v] - d[u]) & (1<<k)){
v = parent[k][v];
}
}
if(u==v) return u;
for(int k = LOG-1;k>=0;k--){
if(parent[k][u]!=parent[k][v]){
u = parent[k][u];
v = parent[k][v];
}
}
return parent[0][u];
}
int dist(int u, int v){
int z = lca(u,v);
return d[u] + d[v] - 2*d[z];
}
int par[100010],sz[100010];
void unite_init(int n){
for(int i=0;i<n;i++){
par[i] = i; sz[i] = 1;
}
}
int find(int x){
if(par[x]==x) return x;
return par[x] = find(par[x]);
}
void unite(int x, int y){
x = find(x); y = find(y);
if(x==y) return;
if(sz[x]<sz[y]) swap(x,y);
sz[x] += sz[y]; par[y] = x;
}
bool same(int x, int y){
return find(x)==find(y);
}
vector<int> vec[100010];
set<int> s[100010];
void dfs2(int v, int p){
if(s[find(v)].count(v)){
vec[find(v)].push_back(v);
}
for(int u:G[v]){
if(u==p) continue;
dfs2(u,v);
}
}
int main(){
int i,n,m,q;
cin >> n >> m >> q;
unite_init(n);
for(i=0;i<m;i++){
int u,v;
cin >> u >> v; u--; v--;
G[u].push_back(v);
G[v].push_back(u);
unite(u,v);
}
for(i=0;i<n;i++){
ver[find(i)].push_back(i);
}
for(i=0;i<n;i++){
if(par[i]==i){
init(find(i),par[i]);
}
}
long long ans = 0;
for(i=0;i<q;i++){
int a,b; cin >> a >> b;
a--; b--;
if(same(a,b)){
ans += dist(a,b);
}else{
s[find(a)].insert(a);
s[find(b)].insert(b);
}
}
for(i=0;i<n;i++){
if(par[i]!=i) continue;
dfs2(i,-1);
if(vec[i].size()<=1) continue;
int x = vec[i][0],y = vec[i].back();
int z = lca(x,y);
for(int v:s[i]){
ans += dist(v,z);
}
}
cout << ans << endl;
}
pockyny