codeforces 757F - 最短路DAG+灭绝树
Description
给定一个n个点,m条边的带权无向图,和起点S。请你选择一个点u(u!=S),使得在图中删掉点u 后,有尽可能多的点到S的最短距离改变。
Solution
先建出最短路DAG,在DAG中跑出灭绝树
灭绝树是一个点灭绝后子树中的点都灭绝的一棵树(灭绝在不同题目中意义不同)
先拓扑一下,每个点的最短路依赖的点就在它拓扑序前了
我们在拓扑序中从前往后扫
扫到点x,它的依赖点都已求出灭绝树父亲
x的灭绝树父亲就是它所有依赖点的灭绝树LCA
LCA可以用树上倍增求一下
Notice
1.可能有些点不连通
2.long long
Code
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
using namespace std;
typedef long long LL;
const int M=200007;
const int E=600007;
inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
}
int n,m,S;
struct node{int x,y;LL d;}ed[E];
int g[M],te;
struct edge{
int y,next;
LL d;
}e[E];
void addedge(int x,int y,LL z){
e[++te].y=y;
e[te].d=z;
e[te].next=g[x];
g[x]=te;
}
int gd[M],td, gu[M],tu;
struct link{
int y,next;
}dw[E],up[E];
void adddw(int x,int y){
dw[++td].y=y;
dw[td].next=gd[x];
gd[x]=td;
}
void addup(int x,int y){
up[++tu].y=y;
up[tu].next=gu[x];
gu[x]=tu;
}
int que[M],vis[M];
LL dis[M];
void inc(int &x){x++;if(x>=M)x=0;}
void spfa(int ss){
int h=0,t=1,x,p,y;
que[t]=ss;
memset(dis,127,sizeof(dis));
dis[ss]=0;
vis[ss]=1;
while(h^t){
inc(h); x=que[h];
for(p=g[x];p;p=e[p].next){
y=e[p].y;
if(dis[x]+e[p].d<dis[y]){
dis[y]=dis[x]+e[p].d;
if(!vis[y]){
vis[y]=1;
inc(t); que[t]=y;
}
}
}
vis[x]=0;//***********
}
}
int indu[M];
void Dag(){
int i,x,y;
for(i=1;i<=m;i++){
x=ed[i].x;
y=ed[i].y;
if(dis[x]>dis[y]) swap(x,y);
if(dis[x]+ed[i].d==dis[y]){
adddw(x,y);
addup(y,x);
indu[y]++;
}
}
}
void topu(){
int h=0,t=1,x,p,y;
que[1]=S;
while(h^t){
x=que[++h];
for(p=gd[x];p;p=dw[p].next){
y=dw[p].y;
indu[y]--;
if(indu[y]==0) que[++t]=y;
}
}
n=t;//排掉不连通的点*************************
}
int pre[M][22];
int dep[M];
int sz[M];
int unit;
int LCA(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
int t;
for(t=unit;t>=0;t--){
if(dep[pre[x][t]]>=dep[y]) x=pre[x][t];
}
if(x==y) return x;
for(t=unit;t>=0;t--){
if(pre[x][t]!=pre[y][t]) x=pre[x][t], y=pre[y][t];
}
return pre[x][0];
}
int main(){
int i,j,p,x,y,z;
n=rd(), m=rd(), S=rd();
for(i=1;i<=m;i++){
x=rd(),y=rd(),z=rd();
addedge(x,y,z);
addedge(y,x,z);
ed[i].x=x;
ed[i].y=y;
ed[i].d=(LL)z;
}
spfa(S);
Dag();
topu();
unit=(int)(log(n)/log(2))+1;
for(i=0;i<=unit;i++) pre[S][i]=S;
dep[S]=1;
for(i=2;i<=n;i++){
x=que[i];
z=0;
for(p=gu[x];p;p=up[p].next){
y=up[p].y;
if(!z) z=y;
else z=LCA(z,y);
}
pre[x][0]=z;
dep[x]=dep[z]+1;
for(j=1;j<=unit;j++) pre[x][j]=pre[pre[x][j-1]][j-1];
}
for(i=n;i>1;i--){
x=que[i];
sz[x]++;
sz[pre[x][0]]+=sz[x];
}
sz[S]++;//不是sz[1]++;
int ans=0;
for(i=2;i<=n;i++)
ans=max(ans,sz[que[i]]);
printf("%d\n",ans);
return 0;
}
codeforces 757F - 最短路DAG+灭绝树的更多相关文章
- CF757F-Team Rocket Rises Again【最短路,DAG支配树】
正题 题目链接:https://www.luogu.com.cn/problem/CF757F 题目大意 \(n\)个点\(m\)条边的一张无向图,求删除\(s\)以外的一个点改变\(s\)到最多点的 ...
- codeforces 757F Team Rocket Rises Again
链接:http://codeforces.com/problemset/problem/757/F 正解:灭绝树. mdzz倍增lca的根节点深度必须是1..我因为这个错误调了好久. 我们考虑先求最短 ...
- bzoj 2815 灭绝树
对于一个食物网(一个DAG),一个物种死亡后,某些物种就必然死亡,求出必然死亡的是那些物种. 灭绝树的另一种含义是:“灭绝树跟节点到节点u的路径上的节点由那些原图中从根节点到节点u的所有路径中都经过了 ...
- Codeforces 219D. Choosing Capital for Treeland (树dp)
题目链接:http://codeforces.com/contest/219/problem/D 树dp //#pragma comment(linker, "/STACK:10240000 ...
- 最短路DAG
边权皆为正时,有最短路DAG. 最短路DAG代表了从原点到每个点的所有最短路. 最短路树个数=最短路DAG生成树个数.用DAG生成树计数即可.复杂度\(O(n+m)\).
- [HAOI2012]道路(最短路DAG上计数)
C国有n座城市,城市之间通过m条[b]单向[/b]道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我们需要对每 ...
- Codeforces 633C Spy Syndrome 2 | Trie树裸题
Codeforces 633C Spy Syndrome 2 | Trie树裸题 一个由许多空格隔开的单词组成的字符串,进行了以下操作:把所有字符变成小写,把每个单词颠倒过来,然后去掉单词间的空格.已 ...
- 【BZOJ4912】天才黑客(最短路,虚树)
[BZOJ4912]天才黑客(最短路,虚树) 题面 BZOJ 洛谷 题解 \(Anson\)爷讲过的题目,然而我还是不会做 只有照着\(zsy\)的程序打我才会做....果然太弱了. 这道题目显然是把 ...
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
随机推荐
- 定位设备--llseek实现
/** 如果llseek实现lseek和llseek系统调用,如果未定义llseek方法, 内核默认修改file结构体中的f_pos成员来实现定位,如果是操作一个 设备,则需提供自己的llseek方法 ...
- Java 批量文件压缩导出,并下载到本地
主要用的是org.apache.tools.zip.ZipOutputStream 这个zip流,这里以Execl为例子. 思路首先把zip流写入到http响应输出流中,再把excel的流写入zip ...
- 关于union的一些问题
创建一个测试数据表 CREATE TABLE `temp_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT ...
- javascript oo实现
很久很久以前,我还是个phper,第一次接触javascript觉得好神奇.跟传统的oo类概念差别很大.记得刚毕业面试,如何在javascript里面实现class一直是很热门的面试题,当前面试百度就 ...
- ecshop里提出来的js常用函数
目录 Utils.js jquery.listTable.js 使用例子: ecshop里提出来的js常用函数 Utils.js /* $Id : utils.js 5052 2007-02-03 1 ...
- 2 > 1 and 3 < 4 or 4 > 5 and 2 < 1
a,b,c,d,e=1,2,3,4,5 m = b >a and c < d n = d > e and b < a y = m or n info = ''' m is %s ...
- Harbor HA部署-使用Ceph RADOS后端
1. 前言 Harbor 1.4.0版本开始提供了HA部署方式,和非HA的主要区别就是把有状态的服务分离出来,使用外部集群,而不是运行在本地的容器上.而无状态的服务则可以部署在多个节点上,通过配置上层 ...
- 菜鸟学Linux - 文件/文件夹的隐藏属性
文件/文件夹居然还有隐藏属性?没错,隐藏属性对于文件/文件夹的安全很重要.好比如说,我们需要使用”鉴定符“来揭开装备的隐藏属性:在Linux中chattr/lsattr就是“鉴定符”. chattr基 ...
- 读书笔记jvm探秘之一:内存概况
jvm内存大致可以分为六大块: 堆,虚拟机主要内存,可以形象的说,堆是对象的存储库,几乎所有的对象实例和数组都在此分配内存,当然也死于此,jvm垃圾回收机制(简称GC)主要处理的就是这个地方.它被所有 ...
- 自我介绍&友链
目录 此博客 我是谁? 友链 此博客 此博客主要更新一些题解什么的...(随缘啦) 本蒟蒻太菜了,博客中出现了错误希望指出,谢谢! . . 我是谁? SD的一名蒟蒻!emm... 喜欢摸鱼. 喜欢抽卡 ...