結果
| 問題 |
No.922 東北きりきざむたん
|
| コンテスト | |
| ユーザー |
Rubikun
|
| 提出日時 | 2019-11-08 22:27:05 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,168 bytes |
| コンパイル時間 | 1,860 ms |
| コンパイル使用メモリ | 175,128 KB |
| 実行使用メモリ | 28,928 KB |
| 最終ジャッジ日時 | 2024-09-15 01:38:51 |
| 合計ジャッジ時間 | 5,844 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge6 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 WA * 1 |
| other | AC * 3 WA * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(),(x).end()
const int mod=1000000007,MAX=100003,MAX_LOG=20,INF=1<<30;
vector<int> G[MAX];
int seen[MAX],cnt[MAX];
int N,par[MAX_LOG][MAX],dis[MAX];
void BFS(int u){
queue<int> Q;
Q.push(u);
dis[u]=0;
while(!Q.empty()){
int a=Q.front();
Q.pop();
for(int i=0;i<G[a].size();i++){
int b=G[a][i];
if(dis[b]==-1){
dis[b]=dis[a]+1;
par[0][b]=a;
Q.push(b);
}
}
}
return;
}
void init(){
for(int k=0;k+1<MAX_LOG;k++){
for(int i=0;i<N;i++){
if(par[k][i]<0) par[k+1][i]=-1;
else par[k+1][i]=par[k][par[k][i]];
}
}
}
int lca(int u,int v){
if(dis[u]>dis[v]) swap(u,v);
for(int i=0;i<20;i++){
if(((dis[v]-dis[u])>>i)&1) v=par[i][v];
}
if(u==v)return u;
for(int i=19;i>=0;i--){
if(par[i][u]!=par[i][v]){
u = par[i][u];
v = par[i][v];
}
}
return par[0][u];
}
int parrrr[MAX],size[MAX];
void UFinit(int n){
for(int i=0;i<n;i++){
parrrr[i]=i;
size[i]=1;
}
}
int root(int a){
if(parrrr[a]==a) return a;
else return parrrr[a]=root(parrrr[a]);
}
void unite(int a,int b){
if(root(a)!=root(b)){
size[root(a)]+=size[root(b)];
parrrr[root(b)]=root(a);
}
}
bool check(int a,int b){
return root(a)==root(b);
}
int cost[MAX],visited[MAX],mini[MAX];
void preDFS(int s,int u,int p){
visited[u]=1;
for(int to:G[u]){
if(to==p) continue;
preDFS(s,to,u);
cnt[u]+=cnt[to];
cost[u]+=cnt[to]+cost[to];
}
if(p==-1){
mini[s]=min(mini[s],cost[s]);
}
}
void DFS(int s,int u,int p){
for(int to:G[u]){
if(to==p) continue;
int a=cost[to],b=cnt[to],c=cost[u],d=cnt[u];
cost[to]+=cnt[u]-cnt[to]+cost[u]-cost[to];
cnt[to]+=cnt[u]-cnt[to];
cost[u]-=(a+b);
cnt[u]-=b;
mini[s]=min(mini[s],cost[u]);
DFS(s,to,u);
cost[to]=a;
cnt[to]=b;
cost[u]=c;
cnt[u]=d;
}
mini[s]=min(mini[s],cost[u]);
}
int main(){
int M,Q;cin>>N>>M>>Q;
UFinit(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);
unite(a,b);
}
ll ans=0;
for(int i=0;i<N;i++){
dis[i]=-1;
mini[i]=INF;
for(int j=0;j<20;j++){
par[j][i]=-1;
}
}
for(int i=0;i<N;i++){
if(dis[i]==-1) BFS(i);
}
init();
for(int i=0;i<Q;i++){
int a,b;cin>>a>>b;
a--;b--;
if(check(a,b)){
ans+=dis[a]+dis[b]-2*dis[lca(a,b)];
}else{
cnt[a]++;
cnt[b]++;
}
}
for(int i=0;i<N;i++){
if(visited[i]==0){
preDFS(i,i,-1);
DFS(i,i,-1);
ans+=mini[i];
}
//cout<<i<<" "<<ans<<endl;
}
cout<<ans<<endl;
}
Rubikun