結果

問題 No.922 東北きりきざむたん
ユーザー kotatsugamekotatsugame
提出日時 2019-11-08 22:49:33
言語 C++14
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 197 ms / 2,000 ms
コード長 2,118 bytes
コンパイル時間 888 ms
コンパイル使用メモリ 77,340 KB
実行使用メモリ 25,116 KB
最終ジャッジ日時 2023-10-13 04:27:04
合計ジャッジ時間 5,100 ms
ジャッジサーバーID
(参考情報)
judge15 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 4 ms
11,980 KB
testcase_01 AC 4 ms
11,952 KB
testcase_02 AC 4 ms
11,948 KB
testcase_03 AC 4 ms
11,856 KB
testcase_04 AC 4 ms
11,924 KB
testcase_05 AC 4 ms
11,892 KB
testcase_06 AC 4 ms
11,896 KB
testcase_07 AC 4 ms
12,000 KB
testcase_08 AC 4 ms
12,000 KB
testcase_09 AC 55 ms
14,696 KB
testcase_10 AC 48 ms
12,972 KB
testcase_11 AC 55 ms
14,100 KB
testcase_12 AC 17 ms
13,824 KB
testcase_13 AC 18 ms
12,604 KB
testcase_14 AC 83 ms
16,116 KB
testcase_15 AC 9 ms
13,744 KB
testcase_16 AC 166 ms
17,372 KB
testcase_17 AC 167 ms
17,536 KB
testcase_18 AC 168 ms
17,340 KB
testcase_19 AC 173 ms
17,560 KB
testcase_20 AC 166 ms
17,552 KB
testcase_21 AC 195 ms
17,784 KB
testcase_22 AC 193 ms
17,948 KB
testcase_23 AC 195 ms
17,416 KB
testcase_24 AC 197 ms
17,408 KB
testcase_25 AC 165 ms
18,048 KB
testcase_26 AC 164 ms
18,120 KB
testcase_27 AC 167 ms
18,028 KB
testcase_28 AC 60 ms
13,656 KB
testcase_29 AC 181 ms
25,116 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp:92:1: 警告: ISO C++ では型の無い ‘main’ の宣言を禁止しています [-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