CodeForces 592D Super M
2016-05-08 21:39
309 查看
先把没用的边去掉,求出包含m个点的最小树。然后求出最小树的直径就可以得到答案了。
#include <cstdio> #include <cstring> #include <vector> #include<cmath> using namespace std; const int maxn=130000; struct Edge { int u,v; int next; } e[2*maxn]; int tot; int h[maxn]; bool f[maxn],q[maxn]; int head[maxn]; int n,m; int st1,st2; int len; void add(int a,int b) { e[tot].u=a; e[tot].v=b; e[tot].next=head[a]; head[a]=tot; tot++; } void dfs(int x) { f[x]=1; for(int i=head[x]; i!=-1; i=e[i].next) { if(f[e[i].v]==0) { dfs(e[i].v); if(q[e[i].v]==1) q[x]=1; } } } void Find(int x,int le,int op) { f[x]=1; if(op==1) { if(le>len) len=le,st1=x; else if(le==len&&x<st1) st1=x; } else if(op==2) { if(le>len) len=le,st2=x; else if(le==len&&x<st2) st2=x; } for(int i=head[x]; i!=-1; i=e[i].next) { if(q[e[i].u]==0) continue; if(q[e[i].v]==0) continue; if(f[e[i].v]==0) Find(e[i].v,le+1,op); } } int main() { scanf("%d%d",&n,&m); memset(f,0,sizeof f); memset(q,0,sizeof q); memset(head,-1,sizeof head); tot=0; for(int i=1; i<n; i++) { int u,v; scanf("%d%d",&u,&v); add(u,v); add(v,u); } for(int i=1; i<=m; i++) { int x; scanf("%d",&x); q[x]=1; } int g; for(int i=1; i<=n; i++) if(q[i]==1) { g=i; dfs(g); break; } st1=st2=0x7FFFFFFF; memset(f,0,sizeof f); len=0; Find(g,0,1); memset(f,0,sizeof f); len=0; Find(st1,0,2); int ans1=min(st1,st2); int ans2=0; for(int i=0; i<tot; i=i+2) { if(q[e[i].u]==0) continue; if(q[e[i].v]==0) continue; ans2=ans2+2; } ans2=ans2-len; printf("%d\n%d\n",ans1,ans2); return 0; }
相关文章推荐
- Android图片缓存
- 可视区域判断
- SDUT 3386 小雷的冰茶几
- JOptionPane 对话框
- TypeError:this.K is undefined
- 插楼:(两款工具,帮你用好数据库)
- 如何在Eclipse中生成Native类对应的JNI的.h文件
- 顺序栈的基本操作:初始化、进栈、出栈、读栈顶元素
- 转圈打印二维数组
- 字符集,索引,视图,存储过程函数,变量,条件,光标,流程,事件,触发器
- Java千百问_06数据结构(013)_数组如何传递
- 左旋(右旋)字符串
- mysql使用distinct注意事项
- 为什么我们给父母的耐心总是那么少?
- 十 传感器
- 解决:java.sql.SQLException: 不能在 UTF8 和 UCS2 之间转换: failUTF8Conv
- location.hash的用法及onhashchange (精华,建议大家没事读一下)
- 魅族MX3 smart bar处失灵
- 20145101《Java程序设计》第10周学习总结
- 20150325--Redis-01