結果

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

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 MLE -
testcase_01 -- -
testcase_02 -- -
testcase_03 -- -
testcase_04 -- -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function 'int dfs(int, int, int)':
main.cpp:45:1: warning: no return statement in function returning non-void [-Wreturn-type]
   45 | }
      | ^
main.cpp: At global scope:
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];
int 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