记录编号 332782 评测结果 AAAAAAAAA
题目名称 暗之链锁 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 1.939 s
提交时间 2016-10-29 09:52:07 内存使用 3.41 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=100010;
int findroot(int);
void dfs1(int);
void dfs2(int);
int n,m,prt[maxn],anc[maxn],a[maxn],x,y,ans=0;
bool vis[maxn]={false};
vector<int>G[maxn],q[maxn];
int main(){
#define MINE
#ifdef MINE
	freopen("yam.in","r",stdin);
	freopen("yam.out","w",stdout);
#endif
	scanf("%d%d",&n,&m);
	for(int i=1;i<n;i++){
		scanf("%d%d",&x,&y);
		G[x].push_back(y);
		G[y].push_back(x);
	}
	for(int i=0;i<m;i++){
		scanf("%d%d",&x,&y);
		if(x==y)continue;
		a[x]++;
		a[y]++;
		q[x].push_back(y);
		q[y].push_back(x);
	}
	dfs1(1);
	dfs2(1);
	printf("%d",ans);
#ifndef MINE
	printf("\n-------------------------DONE-------------------------\n");
	for(;;);
#endif
	return 0;
}
int findroot(int x){return anc[x]==x?x:(anc[x]=findroot(anc[x]));}
void dfs1(int x){
	int cnt=G[x].size();
	anc[x]=x;
	for(int i=0;i<cnt;i++)if(G[x][i]!=prt[x]){
		prt[G[x][i]]=x;
		dfs1(G[x][i]);
	}
	vis[x]=true;
	cnt=q[x].size();
	for(int i=0;i<cnt;i++)if(vis[q[x][i]])a[findroot(q[x][i])]-=2;
	anc[x]=prt[x];
}
void dfs2(int x){
	int cnt=G[x].size();
	for(int i=0;i<cnt;i++)if(G[x][i]!=prt[x]){
		dfs2(G[x][i]);
		a[x]+=a[G[x][i]];
	}
	if(prt[x]){
		if(!a[x])ans+=m;
		else if(a[x]==1)ans++;
	}
}