这种图论题已经变得简单了。。。

 /* D */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 const int maxn = ;
vi vc[maxn], vc2[maxn];
bool visit[maxn];
bool mark[maxn];
int markp[maxn], pre[maxn];
int mx[maxn], mx_[maxn];
int n, m, length = ;
int mn = INT_MAX, ans = INT_MAX; void bfs(int s) {
queue<int> Q;
int u, v, sz; Q.push(s);
visit[s] = true;
pre[s] = ; while (!Q.empty()) {
u = Q.front();
Q.pop();
sz = SZ(vc[u]);
rep(i, , sz) {
v = vc[u][i];
if (!visit[v]) {
visit[v] = true;
pre[v] = u;
Q.push(v);
}
}
}
} void dfs3(int v) {
if (visit[v])
return; visit[v] = true;
int u = pre[v]; length += ;
vc2[u].pb(v);
vc2[v].pb(u);
if (u)
dfs3(u);
} void dfs(int u, int fa) {
int v, sz = SZ(vc2[u]); mx[u] = mx_[u] = ;
rep(i, , sz) {
v = vc2[u][i];
if (v == fa)
continue; dfs(v, u);
if (mx[v]+ > mx[u]) {
mx_[u] = mx[u];
mx[u] = mx[v] + ;
} else if (mx[v]+ > mx_[u]) {
mx_[u] = mx[v]+;
}
} #ifndef ONLINE_JUDGE
printf("u = %d, mx[u] = %d, mx_[u] = %d\n", u, mx[u], mx_[u]);
#endif
} void dfs2(int u, int fa, int pmx) {
int v, sz = SZ(vc2[u]);
int cmx = max(mx[u], pmx), tmp; if (length-cmx < mn) {
mn = length - cmx;
ans = u;
} else if (length-cmx==mn && u<ans) {
ans = u;
} rep(i, , sz) {
v = vc2[u][i];
if (v == fa)
continue; if (mx[v]+ == mx[u]) {
tmp = max(pmx, mx_[u])+;
} else {
tmp = max(pmx, mx[u])+;
} dfs2(v, u, tmp);
}
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int u, v, x; scanf("%d %d", &n, &m);
rep(i, , n) {
scanf("%d %d", &u, &v);
vc[u].pb(v);
vc[v].pb(u);
} rep(i, , m) {
scanf("%d", &x);
markp[i] = x;
mark[x] = true;
} bfs(x);
memset(visit, false, sizeof(visit));
visit[x] = true;
rep(i, , m)
dfs3(markp[i]);
dfs(x, );
dfs2(x, , ); printf("%d\n%d\n", ans, mn); #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

【CF】328 D. Super M的更多相关文章

  1. 【转】Java中super和this的几种用法与区别

    1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位.   class Base {   Base() {   System.out.println("Base&qu ...

  2. 【python】class之super关键字的作用

    在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(self):    prin ...

  3. 【转】python 调用super()初始化报错“TypeError: super() takes at least 1 argument”

    一.实验环境 1.Windows7x64_SP1 2.Anaconda2.5.0 + python2.7(anaconda集成,不需单独安装) 二.实验步骤 2.1 在python中有如下代码: cl ...

  4. 【CF】438E. The Child and Binary Tree

    http://codeforces.com/contest/438/problem/E 题意:询问每个点权值在 $c_1, c_2, ..., c_m$ 中,总权值和为 $s$ 的二叉树个数.请给出每 ...

  5. 【CF】148D Bag of mice

    http://codeforces.com/problemset/problem/148/D 题意:w个白b个黑,公主和龙轮流取,公主先取,等概率取到一个.当龙取完后,会等概率跳出一只.(0<= ...

  6. 【CF】323 Div2. D. Once Again...

    挺有意思的一道题目.考虑长度为n的数组,重复n次,可以得到n*n的最长上升子序列.同理,也可以得到n*n的最长下降子序列.因此,把t分成prefix(上升子序列) + cycle(one intege ...

  7. 【CF】7 Beta Round D. Palindrome Degree

    manacher+dp.其实理解manacher就可以解了,大水题,dp就是dp[i]=dp[i>>1]+1如何满足k-palindrome条件. /* 7D */ #include &l ...

  8. 【CF】86 B. Petr#

    误以为是求满足条件的substring总数(解法是KMP分别以Sbeg和Send作为模式串求解满足条件的position,然后O(n^2)或者O(nlgn)求解).后来发现是求set(all vali ...

  9. 【CF】121 Div.1 C. Fools and Roads

    题意是给定一棵树.同时,给定如下k个查询: 给出任意两点u,v,对u到v的路径所经过的边进行加计数. k个查询后,分别输出各边的计数之和. 思路利用LCA,对cnt[u]++, cnt[v]++,并对 ...

随机推荐

  1. IOS-用动画组制作花瓣掉落效果(另附iOS动画图表)

    重要的两个方法:1.动画的数组:animations 2.启动的时间 beginTime 注意:动画组设置了持续时间(duration)可能会导致动画组里面的持续时间不管用 代码如下: #import ...

  2. Razor引擎学习:RenderBody,RenderPage和RenderSection

    ASP.NET MVC 3 已经正式发布了,现在估计许多人都在拼命学,我也不能例外,刚刚看到了一篇文章,介绍了三个非常有用的方法:RenderBody,RenderPage和RenderSection ...

  3. dorado需要的包

    创建dorado示例中心项目WEB-INF下的lib里的包有很多,包括连接数据库的完整的包,新建的项目,可以直接从这里面拷贝包. 当然如果需要连接mySql数据库,还需要手动导入mySql的包.

  4. (hdu)2444 The Accomodation of Students 判断二分图+最大匹配数

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2444 Problem Description There are a group of s ...

  5. bzoj 1066: [SCOI2007] 蜥蜴

    这道题还是挺好想的,但我一开始还是想错了…… 把每个石柱拆成两个点,一个入度,一个出度,两个点连一条容量为高度的边,这样就可以限制从此石柱上经过的蜥蜴的数量.关于蜥蜴是否单独成点,我是单独当成了一个点 ...

  6. SpringMVC控制器配置文件

    1 首先引入 xml 的约束 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&quo ...

  7. jquery checkbox 选中 全选 插件

    checkbox  选中 全选 在项目中经常用到,但是不同的程序员写出的东西各有差异,在此整合了jquery checkbox插件,用起来很方便,也总结了我们项目中通常会出现问题的地方,一行代码搞定. ...

  8. Android AndroidManifest学习笔记

    <application>标签 : android:allowBackup="true" 数据可以备份 <activity>标签:configChanges ...

  9. 3d旋转--transform-style: preserve-3d,translate3d(x,y,z),perspective()

    transform-style: preserve-3d,translate3d(x,y,z),perspective() 让其倾斜的核心:加perspective(600px)让其动的核心:rans ...

  10. IOS中如何判断APP是否安装后首次运行或升级后首次运行

    对于是否为首次安装的App可以使用如下方法来判断 [[NSUserDefaults standardUserDefaults] boolForKey:@"firstLaunch"] ...