[FJOI2014]最短路径树问题
Description
Input
Output
Sample Input
1 2 1
2 3 1
3 4 1
2 5 1
3 6 1
5 6 1
Sample Output
HINT
首先求字典序最小的最短路树,考虑将边拆成两条单向边,然后按终点从大到小排序,按序插入链式前向星中,保证找到的第一条最短路就是字典序最小的。
点分就比较裸了,记深度为 $i$ 时最大的路径长度为 $sum_i$ ,长度为 $sum_i$ ,且深度为 $i$ 的路径数为 $cnt_i$ 直接转移就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
struct ZYYS
{
int u,v,d;
}E[];
struct Node
{
int next,to,d;
}edge[];
int num,head[],dist[],pre[],pred[];
int size[],maxsize[],minsize,root,w[],k,ans,dep_max,n,m,cnt,c[];
bool vis[];
bool cmp(ZYYS a,ZYYS b)
{
if (a.u==b.u) return a.v>b.v;
return a.u<b.u;
}
void add(int u,int v,int d)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
edge[num].d=d;
}
void SPFA()
{int i;
queue<int>Q;
memset(dist,/,sizeof(dist));
Q.push();
dist[]=;
while (Q.empty()==)
{
int u=Q.front();
Q.pop();
vis[u]=;
for (i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if (dist[v]>dist[u]+edge[i].d)
{
pre[v]=u;
pred[v]=edge[i].d;
dist[v]=dist[u]+edge[i].d;
if (vis[v]==)
{
vis[v]=;
Q.push(v);
}
}
}
}
}
void get_size(int x,int pa)
{int i;
size[x]=;
maxsize[x]=;
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if (v==pa||vis[v]) continue;
get_size(v,x);
size[x]+=size[v];
maxsize[x]=max(maxsize[x],size[v]);
}
}
void get_root(int x,int pa,int r)
{int i;
maxsize[x]=max(size[r]-size[x],maxsize[x]);
if (maxsize[x]<minsize)
{
minsize=maxsize[x];
root=x;
}
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if (v==pa||vis[v]) continue;
get_root(v,x,r);
}
}
void get_ans(int x,int pa,int dis,int dep)
{int i;
if (c[k--dep]&&w[k--dep]+dis==ans)
cnt+=c[k--dep];
else if (c[k--dep]&&ans<w[k--dep]+dis)
ans=w[k--dep]+dis,cnt=c[k--dep];
dep_max=max(dep_max,dep);
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if (v==pa||vis[v]||dep==k-) continue;
get_ans(v,x,dis+edge[i].d,dep+);
}
}
void get_update(int x,int pa,int dis,int dep)
{int i;
if (dis>w[dep]) w[dep]=dis,c[dep]=;
else if (dis==w[dep]) c[dep]++;
dep_max=max(dep_max,dep);
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if (v==pa||vis[v]||dep==k-) continue;
get_update(v,x,dis+edge[i].d,dep+);
}
}
void slove(int x)
{int i;
minsize=2e9;
get_size(x,);
get_root(x,,x);
vis[root]=;
dep_max=;
c[]=;
for (i=head[root];i;i=edge[i].next)
{
int v=edge[i].to;
if (vis[v]) continue;
get_ans(v,root,edge[i].d,);
get_update(v,root,edge[i].d,);
}
for (i=;i<=dep_max;i++)
w[i]=,c[i];
for (i=head[root];i;i=edge[i].next)
{
int v=edge[i].to;
if (vis[v]==)
slove(v);
}
}
int main()
{int i,u,v,d;
cin>>n>>m>>k;
for (i=;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&d);
E[*i-].u=u,E[*i-].v=v,E[*i-].d=d;
E[*i].u=v;E[*i].v=u,E[*i].d=d;
}
sort(E+,E+*m+,cmp);
for (i=;i<=*m;i++)
{
add(E[i].u,E[i].v,E[i].d);
}
SPFA();
memset(head,,sizeof(head));
num=;
for (i=;i<=n;i++)
add(i,pre[i],pred[i]),add(pre[i],i,pred[i]);
slove();
cout<<ans<<' '<<cnt<<endl;
}
[FJOI2014]最短路径树问题的更多相关文章
- [BZOJ4016][FJOI2014]最短路径树问题
[BZOJ4016][FJOI2014]最短路径树问题 试题描述 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长 ...
- bzoj 4016 [FJOI2014]最短路径树问题(最短路径树+树分治)
4016: [FJOI2014]最短路径树问题 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 426 Solved: 147[Submit][Stat ...
- BZOJ_4016_[FJOI2014]最短路径树问题_最短路+点分治
BZOJ_4016_[FJOI2014]最短路径树问题_最短路+点分治 Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择 ...
- 【BZOJ4016】[FJOI2014]最短路径树问题
[BZOJ4016][FJOI2014]最短路径树问题 题面 bzoj 洛谷 题解 虽然调了蛮久,但是思路还是蛮简单的2333 把最短路径树构出来,然后点分治就好啦 ps:如果树构萎了,这组数据可以卡 ...
- [FJOI2014]最短路径树问题 长链剖分
[FJOI2014]最短路径树问题 LG传送门 B站传送门 长链剖分练手好题. 如果你还不会长链剖分的基本操作,可以看看我的总结. 这题本来出的很没水平,就是dijkstra(反正我是不用SPFA)的 ...
- [BZOJ4016][FJOI2014]最短路径树问题(dijkstra+点分治)
4016: [FJOI2014]最短路径树问题 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 1796 Solved: 625[Submit][Sta ...
- 洛谷 [FJOI2014]最短路径树问题 解题报告
[FJOI2014]最短路径树问题 题目描述 给一个包含\(n\)个点,\(m\)条边的无向连通图.从顶点\(1\)出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多 ...
- 【BZOJ4016】[FJOI2014]最短路径树问题 最短路径树+点分治
[BZOJ4016][FJOI2014]最短路径树问题 Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径 ...
- 【BZOJ4016】[FJOI2014]最短路径树问题(点分治,最短路)
[BZOJ4016][FJOI2014]最短路径树问题(点分治,最短路) 题面 BZOJ 洛谷 题解 首先把最短路径树给构建出来,然后直接点分治就行了. 这个东西似乎也可以长链剖分,然而没有必要. # ...
- bzoj 4016: [FJOI2014]最短路径树问题
bzoj4016 最短路路径问题 Time Limit: 5 Sec Memory Limit: 512 MB Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点 ...
随机推荐
- 第2次作业:STEAM案例分析
1.介绍产品的相关信息 1.1我选择的产品是STEAM 1.2选择STEAM的理由 STEAM是一个线上游戏购买平台,不同于亚马逊购买DVD光盘,它支持从游戏库购买数字发行版体验游戏.另外,它也不同于 ...
- Beta 第一天
一.今日任务 重新熟悉整体项目 对整个项目在未来的beta冲刺中进程有一个合理的规划 由于我们送出的是一个负责前端的成员,引入的也是一个负责前端工作的女生,(女生做起美工比起男生更加得心应手吧)所以我 ...
- Flask 学习 十六 部署
部署流程 manage.py 部署命令 每次安装升级只需运行deploy命令即可完成操作 @manager.command def deploy(): """执行部署任务 ...
- linux系统命令学习系列-用户组管理
先复习一下上节内容: 设置密码命令passwd 用户信息修改命令usermod 用户删除命令userdel 作业:修改user1的用户id为505,家目录到admin,用户组为admin,最后删除us ...
- SpringBoot+Angular2 开发环境搭建
https://segmentfault.com/a/1190000007921675
- Spring Security 入门(3-11)Spring Security 的登录密码验证过程 UsernamePasswordAuthenticationFilter
认证过程如下 一.先判断请求(请求必须是post请求)地址是否为配置的 login-processing-url 值(默认/j_spring_security_check),如果不是,则放行,进入下一 ...
- C# 文件操作类大全
C# 文件操作类大全 时间:2015-01-31 16:04:20 阅读:1724 评论:0 收藏:0 [点我收藏+] 标签: 1.创建文件夹 //usin ...
- express实践(一)
涉及以下这些内容: 主体. cookie.session 数据 模板引擎 服务器基本结构: const express=require('express'); const static=require ...
- 集合之深入理解HashMap
Hashmap是一种非常常用的.应用广泛的数据类型 1.hashmap的数据结构 要知道hashmap是什么,首先要搞清楚它的数据结构,在java编程语言中,最基本的结构就是两种,一个是数组,另外一个 ...
- python/零起点(一、字典)
python/零起点(一.字典) dict( )字典 dict()强型转换成字典类型的数据类型: 字典的键(Key)必须是唯一不可变的 字典是无序,字典可变数据类型,且是可迭代的对象 字典清空操作案例 ...