結果

問題 No.922 東北きりきざむたん
ユーザー kotatsugamekotatsugame
提出日時 2019-11-08 22:49:33
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 200 ms / 2,000 ms
コード長 2,118 bytes
コンパイル時間 967 ms
コンパイル使用メモリ 77,736 KB
実行使用メモリ 27,136 KB
最終ジャッジ日時 2024-09-15 02:00:01
合計ジャッジ時間 5,466 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 4 ms
5,888 KB
testcase_01 AC 4 ms
6,016 KB
testcase_02 AC 4 ms
5,888 KB
testcase_03 AC 4 ms
5,888 KB
testcase_04 AC 4 ms
5,888 KB
testcase_05 AC 4 ms
6,016 KB
testcase_06 AC 5 ms
6,016 KB
testcase_07 AC 4 ms
6,144 KB
testcase_08 AC 5 ms
6,016 KB
testcase_09 AC 55 ms
12,544 KB
testcase_10 AC 52 ms
8,064 KB
testcase_11 AC 58 ms
11,008 KB
testcase_12 AC 18 ms
12,800 KB
testcase_13 AC 20 ms
7,680 KB
testcase_14 AC 87 ms
16,384 KB
testcase_15 AC 8 ms
12,928 KB
testcase_16 AC 173 ms
17,536 KB
testcase_17 AC 169 ms
17,612 KB
testcase_18 AC 165 ms
17,556 KB
testcase_19 AC 166 ms
17,536 KB
testcase_20 AC 169 ms
17,536 KB
testcase_21 AC 187 ms
18,176 KB
testcase_22 AC 184 ms
18,056 KB
testcase_23 AC 194 ms
17,608 KB
testcase_24 AC 200 ms
17,664 KB
testcase_25 AC 175 ms
18,416 KB
testcase_26 AC 171 ms
18,176 KB
testcase_27 AC 175 ms
18,120 KB
testcase_28 AC 64 ms
13,824 KB
testcase_29 AC 180 ms
27,136 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp:92:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   92 | main()
      | ^~~~

ソースコード

diff #

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#include<vector>
struct UF{
	int n;
	vector<int>parent,rank;
	UF(int n_=0):n(n_),parent(n_),rank(n_,1)
	{
		for(int i=0;i<n_;i++)parent[i]=i;
	}
	int find(int a){return parent[a]!=a?parent[a]=find(parent[a]):a;}
	bool same(int a,int b){return find(a)==find(b);}
	bool unite(int a,int b)
	{
		a=find(a),b=find(b);
		if(a==b)return false;
		if(rank[a]<rank[b])
		{
			parent[a]=b;
			rank[b]+=rank[a];
		}
		else
		{
			parent[b]=a;
			rank[a]+=rank[b];
		}
		return true;
	}
	int size(int a){return rank[find(a)];}
};
int N,M,Q;
vector<int>G[100000];
int parent[17][100000];
int depth[100000];
void dfs(int u,int d,int p)
{
	depth[u]=d;
	parent[0][u]=p;
	for(int v:G[u])
	{
		if(v!=p)dfs(v,d+1,u);
	}
}
int lca(int u,int v)
{
	if(depth[u]>depth[v])swap(u,v);
	int d=depth[v]-depth[u];
	for(int k=16;k>=0;k--)
	{
		if(d>>k&1)v=parent[k][v];
	}
	if(u==v)return u;
	for(int k=16;k>=0;k--)
	{
		if(parent[k][u]!=parent[k][v])
		{
			u=parent[k][u];
			v=parent[k][v];
		}
	}
	return parent[0][u];
}
int ccnt[100000];
long dis[100000];
void dfs1(int u,int p)
{
	for(int v:G[u])
	{
		if(v!=p)
		{
			dfs1(v,u);
			ccnt[u]+=ccnt[v];
			dis[u]+=dis[v]+ccnt[v];
		}
	}
}
long dfs2(int u,int p,long par,int Ccnt)
{
	long ret=dis[u]+par+Ccnt;
	long val=ret;
	for(int v:G[u])
	{
		if(v!=p)
		{
			ret=min(ret,dfs2(v,u,val-dis[v]-ccnt[v],Ccnt+ccnt[u]-ccnt[v]));
		}
	}
	return ret;
}
main()
{
	cin>>N>>M>>Q;
	UF uf(N);
	for(int i=0;i<M;i++)
	{
		int u,v;cin>>u>>v;
		u--,v--;
		G[u].push_back(v);
		G[v].push_back(u);
		uf.unite(u,v);
	}
	for(int i=0;i<N;i++)
	{
		if(uf.find(i)==i)
		{
			dfs(i,0,-1);
		}
	}
	for(int k=1;k<17;k++)
	{
		for(int i=0;i<N;i++)
		{
			parent[k][i]=parent[k-1][i]!=-1?parent[k-1][parent[k-1][i]]:-1;
		}
	}
	long ans=0;
	for(int i=0;i<Q;i++)
	{
		int a,b;cin>>a>>b;
		a--,b--;
		if(uf.same(a,b))
		{
			int ab=lca(a,b);
			ans+=depth[a]+depth[b]-2*depth[ab];
		}
		else
		{
			ccnt[a]++;
			ccnt[b]++;
		}
	}
	for(int i=0;i<N;i++)
	{
		if(uf.find(i)==i)
		{
			dfs1(i,-1);
			ans+=dfs2(i,-1,0L,0);
		}
	}
	cout<<ans<<endl;
}
0