记录编号 |
332782 |
评测结果 |
AAAAAAAAA |
题目名称 |
暗之链锁 |
最终得分 |
100 |
用户昵称 |
AntiLeaf |
是否通过 |
通过 |
代码语言 |
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++;
}
}