CF #328div2 D
这题不难,当时想出来了,可是却写不出来~~
现在慢慢写回来,也写得好挫~
可以知道,被攻击的城市必定可以组成一棵树,然后,传送到的点必定也是城市之一。如果出发后回到原点,则需要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的更多相关文章
- 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 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- cf Round 613
A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...
- ARC下OC对象和CF对象之间的桥接(bridge)
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...
- [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
- 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 ...
- 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 ...
- CF #376 (Div. 2) C. dfs
1.CF #376 (Div. 2) C. Socks dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...
- CF #375 (Div. 2) D. bfs
1.CF #375 (Div. 2) D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多 ...
随机推荐
- Elasticsearch创建文档,利用Kibana进行创建文档
首先先来了解一下什么是文档,es里边的文档相当于mysql数据库里边的一张表,如果你用过mongodb的话,那么肯定对es这种数据格式一定很了解了.接下来我们来看一下如何创建一个文档. PUT /sd ...
- SpringBoot2.0整合SpringSecurity实现自定义表单登录
我们知道企业级权限框架一般有Shiro,Shiro虽然强大,但是却不属于Spring成员之一,接下来我们说说SpringSecurity这款强大的安全框架.费话不多说,直接上干货. pom文件引入以下 ...
- Sum It Up -- 深搜 ---较难
每一行都是一组测试案例 第一个数字 表示总和 第二个数字表示 一共有几个可用数据 现在 按照从小到大的顺序 输出 那些数字中若干数字之和为总和的 信息 /. 很好很明显的 遍历痕迹 , ...
- 安卓中Canvas实现清屏效果
可以在代码里面添加: paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); canvas.drawPaint(paint) ...
- 如何解决error LNK2001(转载)
转自:http://www.cnblogs.com/myzhijie/articles/1658545.html 解决外部符号错误:_main,_WinMain@16,__beginthreadex ...
- [转]linux之diff 命令
转自:http://www.cnblogs.com/peida/archive/2012/12/12/2814048.html diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是 ...
- Java系列学习(十)-包与权限修饰符
1.形式参数和返回值的问题 (1)形式参数: A:类名:需要该类的对象 B:抽象类名:需要改类的子类对象 C:接口名:需要该接口的实现对象 (2)返回值类型: A:类名:抽象类名:返回的是该类的对象 ...
- C#中的分层开发
一般来说,分层主要分三层即:UI(User Interface) 界面显示层,BLL(Business Logic Layer)业务逻辑层,以及DAL(Data Access Layer)数据访问层. ...
- mysql常用命令介绍
mysql适用于在Internet上存取数据,支持多种平台 1.主键:唯一标识表中每行的这个列,没有主键更新或删除表中的特定行很困难. 2.连接mysql可以用Navicat 要读取数据库中的内容先要 ...
- (转)Arcgis for Js之Graphiclayer扩展详解
http://blog.csdn.net/gisshixisheng/article/details/41208185 在前两节,讲到了两种不同方式的聚类,一种是基于距离的,一种是基于区域范围的,两种 ...