题目描述

给出一个n个点m条边的无向图,n个点的编号从1~n,定义源点为1。定义最短路树如下:从源点1经过边集T到任意一点i有且仅有一条路径,且这条路径是整个图1到i的最短路径,边集T构成最短路树。

给出最短路树,求对于除了源点1外的每个点i,求最短路,要求不经过给出的最短路树上的1到i的路径的最后一条边。

输入

第一行包含两个数n和m,表示图中有n个点和m条边。

接下来m行,每行有四个数ai,bi,li,ti,表示图中第i条边连接ai和bi权值为li,ti为1表示这条边是最短路树上的边,ti为0表示不是最短路树上的边。

输出

输出n-1个数,第i个数表示从1到i+1的要求的最短路。无法到达输出-1。

样例输入

5 9
3 1 3 1
1 4 2 1
2 1 6 0
2 3 4 0
5 2 3 0
3 2 2 1
5 3 1 1
3 5 2 0
4 5 4 0

样例输出

6 7 8 5

提示

对于30%的数据,n≤100,m≤2000
对于100%的数据,n≤4000,m≤100000,1≤li≤100000

分析:

考虑一个点的答案是怎么样的:从$1$到$i$的答案,应该是从$1$沿着树边走,然后经过一条非树边走到以$i$为根的子树中,在沿着树边向上走到$i$。画图可以证明走两条非树边一定更不优。$p[i][j]$表示$i->j$的只经过一条两端在$i$和$j$的子树非树边最短路,$dis[i]$表示$1->i$的最短路,所以$ans[i]=min(p[x][i]+dis[x])$,$x$是$i$子树中的一点。

那么只要处理$dis[i]$和$p[i][j]$,$dis[i]$只要求树上距离即可,$p[i][j]$的计算类似更新答案,$dfs$过程中枚举$1~n$个点,然后用用儿子节点更新当前节点即可。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define M 200005
#define N 4005
using namespace std;
int n,m,dis[N],p[N][N],ans[N],pre[N],las[N],ind;
int hd[N],to[M],nx[M],w[M],cnt;
inline void add(int u,int v,int c){
to[++cnt]=v;w[cnt]=c;nx[cnt]=hd[u];hd[u]=cnt;
}
inline void dfs1(int u,int f){
pre[u]=++ind;
for(int i=hd[u];i;i=nx[i]){
int v=to[i];
if(v!=f){
dis[v]=dis[u]+w[i];
dfs1(v,u);
}
}
las[u]=ind;
}
inline void dfs2(int u,int f){
for(int i=hd[u];i;i=nx[i]){
int v=to[i];
if(v!=f){
dfs2(v,u);
for(int j=1;j<=n;j++){
if(pre[j]>=pre[u]&&las[j]<=las[u]) continue;
p[u][j]=min(p[u][j],p[v][j]+w[i]);
}
}
}
for(int i=1;i<=n;i++){
if(pre[i]>=pre[u]&&las[i]<=las[u]) continue;
ans[u]=min(ans[u],p[u][i]+dis[i]);
}
}
int main(){
scanf("%d%d",&n,&m);
memset(p,123,sizeof p);
for(int i=1;i<=m;i++){
int a,b,l,t;
scanf("%d%d%d%d",&a,&b,&l,&t);
if(t){add(a,b,l);add(b,a,l);}
else p[a][b]=p[b][a]=min(p[a][b],l);
}
memset(ans,123,sizeof ans);
dfs1(1,0);dfs2(1,0);
for(int i=2;i<=n;i++)
if(ans[i]==ans[0]) puts("-1");
else printf("%d\n",ans[i]);
return 0;
}

总结:

图论等,尤其是图论题。很多时候要考虑答案长什么样,什么情况下最优,当有了特殊性质时,题目会更好做。

如果要证明一些性质,可以先假设一些条件,然后用反证法。例如:假设最优答案在(……)上,如果有更优的答案,那么(……)就不是(……)。之类的……

BZOJ 3694&&DTOJ 1972: 最短路的更多相关文章

  1. Bzoj 3694: 最短路 树链剖分

    3694: 最短路 Time Limit: 5 Sec  Memory Limit: 256 MBSubmit: 67  Solved: 34[Submit][Status][Discuss] Des ...

  2. BZOJ 3694 最短路

    233333想简单了.... 题解参见http://hzwer.com/3710.html #include<iostream> #include<cstdio> #inclu ...

  3. bzoj 1295 最长距离 - 最短路

    Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格 ...

  4. BZOJ 2763 分层图最短路

    突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 #include <cstdio> #include <algorithm> #include ...

  5. BZOJ 2763: [JLOI2011]飞行路线 最短路

    2763: [JLOI2011]飞行路线 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  6. BZOJ 2750: [HAOI2012]Road( 最短路 )

    对于每个点都跑最短路, 然后我们得到了个DAG, 在这DAG上更新每条边的答案. 考虑e(u, v)∈DAG对答案的贡献:  假设从S到u得路径数为A[u], 从v出发到达任意点的路径数为B[v], ...

  7. BZOJ.2069.[POI2004]ZAW(最短路Dijkstra 按位划分)

    题目链接 \(Description\) 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. \(n\leq5000,m\le ...

  8. BZOJ 1003 - 物流运输 - [最短路+dp]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1003 Time Limit: 10 Sec Memory Limit: 162 MB D ...

  9. BZOJ 1922--大陆争霸(最短路)

    1922: [Sdoi2010]大陆争霸 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2113  Solved: 947[Submit][Status ...

随机推荐

  1. csp-j 复赛感想

    作者:博客园小蔡编程 这次是作者第一次参加csp-j的比赛 内心还是挺激动的 今天,作者就来和大家讨论一下这次csp-j的学习心得和感想 T1 分糖果 这题描述看似复杂 其实就是一道求最大取模的题 L ...

  2. [no_code][Beta]设计和计划

    2020春季计算机学院软件工程(罗杰 任健) 2020春季计算机学院软件工程(罗杰 任健) 作业要求 Beta设计和计划 我们在这个课程的目标是 远程协同工作,采用最新技术开发软件 这个作业在哪个具体 ...

  3. Spring Security:Servlet 过滤器(三)

    3)Servlet 过滤器 Spring Security 过滤器链是一个非常复杂且灵活的引擎.Spring Security 的 Servlet 支持基于 Servlet 过滤器,因此通常首先了解过 ...

  4. linux 内核源代码情景分析——越界访问

    页式存储管理机制通过页面目录和页面表将每个线性地址转换成物理地址,当遇到下面几种情况就会使CPU产生一次缺页中断,从而执行预定的页面异常处理程序: ① 相应的页面目录或页表项为空,也就是该线性地址与物 ...

  5. 一步一步学ROP之linux_x86篇(蒸米spark)

    目录 一步一步学ROP之linux_x86篇(蒸米spark) 0x00 序 0x01 Control Flow Hijack 程序流劫持 0x02 Ret2libc – Bypass DEP 通过r ...

  6. python中将xmind转成excel

    需求:最近公司项目使用tapd进行管理,现在遇到的一个难题就是,使用固定的模板编写测试用例,使用excel导入tapd进行测试用例管理,觉得太过麻烦,本人一直喜欢使用导图来写测试用例,故产生了这个工具 ...

  7. 虚拟机克隆后修改mac地址和ip地址

    (1)虚拟机克隆在新的虚拟机下会有文件产生变化. /etc/udev/rules.d/70-persistent-net.rules  文件中会多一个eth1 网卡的文件 ,eth0 的那行文件是原虚 ...

  8. 面试题系列:用了这么多年的 Java 泛型,我竟然只知道它的皮毛

    面试题:说说你对泛型的理解? 面试考察点 考察目的:了解求职者对于Java基础知识的掌握程度. 考察范围:工作1-3年的Java程序员. 背景知识 Java中的泛型,是JDK5引入的一个新特性. 它主 ...

  9. 使用jax加速Hamming Distance的计算

    技术背景 一般认为Jax是谷歌为了取代TensorFlow而推出的一款全新的端到端可微的框架,但是Jax同时也集成了绝大部分的numpy函数,这就使得我们可以更加简便的从numpy的计算习惯中切换到G ...

  10. testNG 注解使用说明

    1.TestNG常用注解 @BeforeSuite 标记的方法:在某个测试套件(suite)开始之前运行 @BeforeTest 在某个测试(test)开始之前运行 @BeforeClass 在某个测 ...