这题不难,当时想出来了,可是却写不出来~~

现在慢慢写回来,也写得好挫~

可以知道,被攻击的城市必定可以组成一棵树,然后,传送到的点必定也是城市之一。如果出发后回到原点,则需要2E,E是树的边数,则2E-D就是答案,D是树中直径。

我写得好锉~

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define LL long long
using namespace std; const int MAX=123460; struct Edge{
int u,v,next;
}edge[MAX*2]; int head[MAX],dis[MAX];
int n,m,tot;
bool chose[MAX];
int pre[MAX],point[MAX],deg[MAX];
int dis1[MAX],node1[MAX],dis2[MAX],node2[MAX];
bool vis[MAX]; void addedge(int u,int v){
edge[tot].u=u;
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
} int BFS(int rt,int counts){
queue<int>que;
que.push(rt);
vis[rt]=true;
int u,v;
while(!que.empty()&&counts){
u=que.front();
que.pop();
vis[u]=true;
if(chose[u]) counts--;
for(int e=head[u];e!=-1;e=edge[e].next){
v=edge[e].v;
if(vis[v]) continue;
que.push(v);
pre[v]=u;
}
}
memset(vis,false,sizeof(vis));
while(!que.empty()) que.pop(); for(int i=1;i<=m;i++) que.push(point[i]);
while(!que.empty()){
u=que.front();
que.pop();
v=pre[u];
if(v!=-1){
if(!vis[v]){
que.push(v);
chose[v]=false;
}
vis[v]=true;
}
} while(!que.empty()) que.pop();
memset(vis,false,sizeof(vis));
for(int i=1;i<=m;i++) if(chose[point[i]]) que.push(point[i]);
memset(deg,0,sizeof(deg));
int ans=0;
while(!que.empty()){
u=que.front();
vis[u]=true;
que.pop();
v=pre[u];
if(v!=-1){
ans++;
if(!vis[v])
que.push(v);
deg[v]++;
vis[v]=true;
}
} while(!que.empty()) que.pop();
for(int i=1;i<=m;i++) if(chose[point[i]]) que.push(point[i]);
while(!que.empty()){
u=que.front();
dis[dis1[u]]=dis[dis1[u]]==0?min(node1[u],u):min(min(node1[u],u),dis[dis1[u]]);
dis[dis1[u]+dis2[u]]=dis[dis1[u]+dis2[u]]==0?min(node1[u],node2[u]):min(min(node1[u],node2[u]),dis[dis1[u]+dis2[u]]);
que.pop();
v=pre[u];
if(v!=-1){
deg[v]--;
if(!deg[v]) que.push(v);
dis1[u]+=1;
if(dis1[u]>dis1[v]){
dis2[v]=dis1[v],node2[v]=node1[v];
dis1[v]=dis1[u],node1[v]=node1[u];
}
else if(dis1[u]==dis1[v]){
if(node1[u]<node1[v]){
dis2[v]=dis1[v],node2[v]=node1[v];
node1[v]=node1[u];
}
else{
if(dis1[u]>dis2[v]){
dis2[v]=dis1[u],node2[v]=node1[u];
}
else if(dis1[u]==dis2[v]){
if(node1[u]<node2[v]){
node2[v]=node1[u];
}
}
}
}
else{
if(dis1[u]>dis2[v]){
dis2[v]=dis1[u],node2[v]=node1[u];
}
else if(dis1[u]==dis2[v]){
if(node1[u]<node2[v]){
node2[v]=node1[u];
}
}
} }
}
/// cout<<ans<<endl;
/// printf("%d\n",node1[rt]);
for(int i=n;i>=1;i--){
if(dis[i]>0){
printf("%d\n",dis[i]);
return ans*2-i;
}
}
printf("%d\n",point[1]);
return ans; } int main(){
int u,v;
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=1;i<=n;i++){
head[i]=-1,chose[i]=false,pre[i]=-1;
dis1[i]=dis2[i]=0,node1[i]=node2[i]=i;
vis[i]=false; dis[i]=0;
}
tot=0;
for(int i=1;i<n;i++){
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
for(int i=1;i<=m;i++){
scanf("%d",&u);
point[i]=u;
chose[u]=true;
}
printf("%d\n",BFS(u,m)); }
return 0;
}

  

CF #328div2 D的更多相关文章

  1. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  2. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  3. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  4. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  5. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  6. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  7. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

  8. CF #376 (Div. 2) C. dfs

    1.CF #376 (Div. 2)    C. Socks       dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...

  9. CF #375 (Div. 2) D. bfs

    1.CF #375 (Div. 2)  D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多 ...

随机推荐

  1. [Swift通天遁地]七、数据与安全-(11)如何检测应用程序中的内存泄露

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. Python/Django 下载Excel2007

    一.前提 上一篇,我写了下载Excel2003的博文,这里写下载Excel2007的博文的原因有三: 第一.Excel2003基本已经淘汰了 第二.Excel2003下载文件太大,不利于网络传输 第三 ...

  3. Gson 转日期中的错误

    今天在用Gson做json转化是遇到一个问题,本地执行没有问题(windows 7),包丢到服务器上(Centos)就报错了. 后经分析发现DateTypeDapter类中取本地环境的日期格式参考ht ...

  4. myeclipse配置tomcat后,无法正常使用的问题

    如图所示:一定要设置为Enable.否则部署tomcat时,没有tomcat8.0

  5. [转]【C/C++】Linux下使用system()函数一定要谨慎

    曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值.它所执行命令的返回值以及命令执行失败原 ...

  6. JS——缓动动画

    核心思想: (1)相对于匀速移动,盒子每次移动的步长都是变化的,公式:盒子位置=盒子本身位置+(目标位置-盒子本身位置)/10 (2)在盒子位置与目标距离小于10px时,其步长必然是小数,又由于off ...

  7. 学不好Python?我们分析看看正确的学习方法是什么-马哥教育

    提起对Python的印象,除了全能之外恐怕就是简单易学了.很多人都在推荐新手学Python入门,毕竟语法简单.语句简洁,所谓“人生苦短我用Python”绝不是一句空话.不过也不能忽视一点:Python ...

  8. BZOJ 2276: [Poi2011]Temperature 单调队列

    Code: #include<bits/stdc++.h> #define maxn 3000000 using namespace std; void setIO(string s) { ...

  9. CVPR2016 Paper list

    CVPR2016 Paper list ORAL SESSIONImage Captioning and Question Answering Monday, June 27th, 9:00AM - ...

  10. IDEA 创建一个普通的java项目

    IntelliJ IDEA 如何创建一个普通的java项目,及创建java文件并运行 首先,确保idea软件正确安装完成,java开发工具包jdk安装完成. IntelliJ IDEA下载地址:htt ...