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个湖,总要填掉多 ...
随机推荐
- [Swift通天遁地]六、智能布局-(2)视图对象的尺寸和位置相对约束
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- switchhosts+fiddler app抓包
1.先去switchhosts和fiddler官网下载并安装 2.打开switchhosts,添加要切换的环境(ip地址) 3.打开fiddler,一定要能抓https包 4.查找本地IP地址,cmd ...
- BZOJ 3514 LCT+主席树
思路: //By SiriusRen #include <bits/stdc++.h> using namespace std; ; ],fa[N],minn[N],rev[N],q[N] ...
- Hadoop Hive概念学习系列之hive里的优化和高级功能(十四)
在一些特定的业务场景下,使用hive默认的配置对数据进行分析,虽然默认的配置能够实现业务需求,但是分析效率可能会很低. Hive有针对性地对不同的查询进行了优化.在Hive里可以通过修改配置的方式进行 ...
- Js控制样式的诸多方法
function TableCss(options){ //如果没参数,就退出 if(arguments.length < 1 || !document.getElementById(optio ...
- TCP简要讲解
TCP被称为面向连接.面向流,可靠的传输层协议.它与UDP最大的不同在于它是可靠性的,所以需要可靠传输的时候就需要用到TCP,如果需要快速传输则选择UDP. TCP的连接又称为3次握手. 1).客 ...
- layer:好看的弹出窗口
layer是一款web弹层组件,只需在调用时简单地配置相关参数,即可轻松实现丰富与便捷的操作体验. 这是layer的官方地址,里面的使用介绍非常详细(http://layer.layui.com/) ...
- Java对象的创建及使用
Java对象的创建及使用 对象是类的具体实例(instance),是真实存在的个体:
- webpack核心概念使用的综合小案例
注: 由于版本更新很快,同样的配置不同版本很可能会出错(这个就很绝望了) 解决思路 看文档 查看源码接口 网上搜索相应错误 环境 webpack4.x + yarn 文件结构 . ├── dist / ...
- git clone下载代码,中途断掉怎么办?
问题如下: 解决办法: 1)运行以下命令进行clone $ git clone --recursive https:xxxxxx 2)进入项目根目录,继续下载 $ cd eigen-git-mirro ...