bzoj 4016: [FJOI2014]最短路径树问题

Description

给一个包含n个点,m条边的无向连通图。从顶点1出发,往其余所有点分别走一次并返回。
往某一个点走时,选择总长度最短的路径走。若有多条长度最短的路径,则选择经过的顶点序列字典序最小的那条路径(如路径A为1,32,11,路径B为1,3,2,11,路径B字典序较小。注意是序列的字典序的最小,而非路径中节点编号相连的字符串字典序最小)。到达该点后按原路返回,然后往其他点走,直到所有点都走过。
可以知道,经过的边会构成一棵最短路径树。请问,在这棵最短路径树上,最长的包含K个点的简单路径长度为多长?长度为该最长长度的不同路径有多少条?
这里的简单路径是指:对于一个点最多只经过一次的路径。不同路径是指路径两端端点至少有一个不同,点A到点B的路径和点B到点A视为同一条路径。

solution

正解:点分治
构出最短路图,在最短路图上面尽量走编号小的点,直到所有的点都加入集合中,构成了最短路树
然后点分治即可

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
#include <vector>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=30005,inf=2e8;
int n,m,k,Head[N],nxt[N*10],to[N*10],dis[N*10],num=1,head[N];
inline void link1(int x,int y,int z){nxt[++num]=Head[x];to[num]=y;dis[num]=z;Head[x]=num;}
inline void link2(int x,int y,int z){nxt[++num]=head[x];to[num]=y;dis[num]=z;head[x]=num;}
bool v[N],d[N];int dd[N];
inline void spfa(int S){queue<int>q;while(!q.empty())q.pop();for(RG int i=0;i<=n;i++)dd[i]=inf,v[i]=0;q.push(S);dd[S]=0;v[S]=1;int x,u;while(!q.empty()){x=q.front();q.pop();for(RG int i=Head[x];i;i=nxt[i]){u=to[i];if(dd[x]+dis[i]<dd[u]){dd[u]=dd[x]+dis[i];if(!v[u])v[u]=1,q.push(u);}}v[x]=0;}
}
struct Grath{int x,dis,id;bool operator <(const Grath &pr)const{return x<pr.x;}};
vector<Grath>G[N];
struct edge{int x,y,z;}e[N*10];
int root=0,son[N]={N},sz[N],sum;bool vis[N];
inline void getroot(int x,int last){sz[x]=1;son[x]=0;for(int i=head[x];i;i=nxt[i]){int u=to[i];if(vis[u] || u==last)continue;getroot(u,x);sz[x]+=sz[u];if(sz[u]>son[x])son[x]=sz[u];}son[x]=Max(son[x],sum-sz[x]);if(son[x]<son[root])root=x;
}
int g[N],f[N],de[N],den=0;bool inde[N];
inline void upd(int x,int last,int dist,int l){if(l>k)return ;if(dist>f[l]){f[l]=dist,g[l]=1;if(!inde[l])inde[l]=true,de[++den]=l;}else if(dist==f[l])g[l]++;for(int i=head[x];i;i=nxt[i]){int u=to[i];if(vis[u] || u==last)continue;upd(u,x,dist+dis[i],l+1);}
}
int ans=0,cnt=0;
inline void getdis(int x,int last,int dist,int l){if(l>k)return ;if(dist+f[k-l]>ans)ans=dist+f[k-l],cnt=g[k-l];else if(dist+f[k-l]==ans)cnt+=g[k-l];for(int i=head[x];i;i=nxt[i]){int u=to[i];if(vis[u] || u==last)continue;getdis(u,x,dist+dis[i],l+1);}
}
inline void calc(int x){g[0]=1;for(int i=head[x];i;i=nxt[i]){int u=to[i];if(vis[u])continue;getdis(u,x,dis[i],2);upd(u,x,dis[i],1);}while(den)f[de[den]]=0,g[de[den]]=0,inde[de[den]]=0,den--;
}
inline void solve(int x){vis[x]=1;calc(x);for(int i=head[x];i;i=nxt[i]){int u=to[i];if(vis[u])continue;root=0;sum=sz[u];getroot(u,x);solve(root);}
}
bool b[N];
inline void dfs(int x){b[x]=1;for(RG int i=0,sz=G[x].size();i<sz;i++){int u=G[x][i].x,id=G[x][i].id;if(dd[x]+G[x][i].dis==dd[u] && !b[u]){link2(e[id].x,e[id].y,e[id].z);link2(e[id].y,e[id].x,e[id].z);dfs(u);}}
}
void work()
{int x,y,z;scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);e[i].x=x;e[i].y=y;e[i].z=z;link1(x,y,z);link1(y,x,z);G[x].push_back((Grath){y,z,i});G[y].push_back((Grath){x,z,i});}for(int i=1;i<=n;i++)sort(G[i].begin(),G[i].end());spfa(1);dfs(1);sum=n;root=0;getroot(1,1);solve(root);printf("%d %d\n",ans,cnt);
}int main()
{work();return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/8046737.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java.nio.file 找不到_java - 断言该错误:无法访问路径(找不到java.nio.file.Path) - 堆栈内存溢出...

我想使用Robolectric进行单元测试&#xff0c;但是我正在尝试使用robolectric进行简单测试&#xff0c;因此一开始我很困惑。 我遵循了手册&#xff0c;对示例进行了同样的操作&#xff0c;甚至其他帖子也无济于事。 每次收到错误消息&#xff1a;无法访问路径。 找不到java.ni…

SSH整合方案二(不带hibernate.cfg.xml)

整体结构: 1.引入相关jar包 2.编写实体类和映射文件 package cn.zqr.domain;public class Customer {private Long cust_id;private String cust_name;private Long cust_user_id;private Long cust_create_id;private String cust_source;private String cust_industry;privat…

java铃声类_MediaPlayer.setDataSource中的java.lang.IllegalStateException,使用铃声类

我有一个用户(Samsung Galaxy S5&#xff0c;Android 4.4)报告的崩溃&#xff0c;我不明白发生了什么。这似乎是可以吸收的&#xff0c;但也许有些人遇到了同样的问题&#xff0c;或类似的问题。MediaPlayer.setDataSource中的java.lang.IllegalStateException&#xff0c;使用…

POJ 1742 Coins ( 经典多重部分和问题 DP || 多重背包 )

题意 : 有 n 种面额的硬币&#xff0c;给出各种面额硬币的数量和和面额数&#xff0c;求最多能搭配出几种不超过 m 的金额&#xff1f; 分析 : 这题可用多重背包来解&#xff0c;但这里不讨论这种做法。 如果之前有接触过背包DP的可以自然想到DP数组的定义 > dp[i][j] 表示…

java nextintln_java – 从lambda表达式引用的局部变量必须是final或者有效的final

我有一个JavaFX 8程序(适用于JavaFXPorts交叉平台),它实际上是为了做我想做的事情,但却是一步之遥.程序读取文本文件,对行进行计数以建立随机范围,从该范围中选取一个随机数并读取该行以进行显示.The error is: local variables referenced from a lambda expression must be f…

css用hover制作下拉菜单

首先我们的需求就是 制作一个鼠标移动到某个区域就会有下拉菜单的弹出,这样会有更多的子类内容,示例代码如下: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>*{mar…

java链式调用空指针_java 链式调用

前言现在很多开源库或者代码都会使用链式调用。因为链式调用在很多时候&#xff0c;都可以使我们的代码更加简洁易懂。以下Student类有多数个属性&#xff0c;让我们看看非链式调用和链式调用有何区别。非链式调用Main类&#xff1a;/*** Created by chenxuxu on 17-1-10.*/pub…

mysql 字典索引_【大白话mysql】你真的了解 mysql 索引吗?

本文来源于公众号&#xff1a; 跬步匠心什么是索引&#xff1f;当我们使用汉语字典查找某个字时&#xff0c;我们会先通过拼音目录查到那个字所在的页码&#xff0c;然后直接翻到字典的那一页&#xff0c;找到我们要查的字&#xff0c;通过拼音目录查找比我们拿起字典从头一页一…

java菜单面板设置完能关闭_用Java创建一个屏幕外框架(或者:当所有应用程序窗口关闭时,如何避免Mac上的空白菜单)?...

你一定要考虑WizardOfOdds非常有用的答案.正确使用“The Application Menu”将有所帮助,并且很容易设置最小的Info.plist开始.持久的文件菜单将允许您的应用程序在其他人关闭时打开一个新窗口.这个answer链接到一个简单的example.虽然Apple的Human Interface Guidelines是您用户…

mysql使用jtable_jtable 的简单使用

做后台管理管理系统时&#xff0c;基于ajax的数据操作和富有表现力的数据绑定插件jtable绝对是一个不错的选择&#xff0c;他接收来自服务器端的json格式的数据。而且他是一款开源的基于jquery和jquery ui的插件&#xff0c;您可以根据自己的需要修改其表现&#xff0c;如css&a…

java正则表达 w_正则表达式[\s\S] 与[\w\W]这样的用法,比较.

更新时间&#xff1a;2020年03月04日 17:29:41 投稿&#xff1a;mdxy-dxy很多人咨询[\s\S]*与[\w\W]* 什么意思&#xff0c;不是有.了吗&#xff0c;那么它们的组合&#xff0c;表示所有的都匹配&#xff0c;与它相对应的&#xff0c;有[\w\W]等&#xff0c;意义完全相同,需要…

dalvik虚拟机与Java区别_05 Android---java虚拟机跟dalvik虚拟机的区别(从01开始点点入门,视频+笔记)...

大家好,我是森森这节课我简单给大家介绍一下java虚拟机跟安卓系统虚拟机的区别.可能时间太晚了,有点不在状态,也有点紧张,大家见谅.05java虚拟机跟dalvik虚拟机的区别这篇文章重点写一写安卓运行时和Java运行时的区别.什么是运行时呢?其实我们所说的虚拟机就是运行时.两种虚拟…

java自定义菜单跳转页面_微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解...

微信公众号开发 自定义菜单请先读完本文再进行配置开发请先前往微信平台开发者文档阅读“网页授权获取用户基本信息”的接口说明在微信公众账号开发中&#xff0c;往往有定义一个菜单&#xff0c;然后用户点击该菜单就进入用户个人中心的功能&#xff0c;通常应用于各个公众账号…

团队项目冲刺第一阶段03

回顾昨天:用了各种FQ软件下载SDK&#xff0c;最后终于在11点半后成功加载出helloworld 今天的任务:学习安卓数据库&#xff0c;实现对数据库信息的添加转载于:https://www.cnblogs.com/cairsha/p/8084694.html

java 解析xls 文件_java简单解析xls文件的方法示例【读取和写入】

本文实例讲述了java简单解析xls文件的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;读取&#xff1a;import java.io.*;import jxl.*;import jxl.write.*;import jxl.format.*;class Aa{public static void main(String args[]) {try{Workbook workbook null;t…

$(document).ready()和window.onload之间的差异

最近使用$(document).ready(function(){})遇到一个问题&#xff1a;加载页面后发送数据请求后台&#xff0c;得到的数据不对&#xff0c;后发现请求后台时&#xff0c;发送的数据为空&#xff0c;没有获取到值导致的。------改成window.onload function(){}或者$(window).load…

用java做出长方体的表面积_计算长方体、四棱锥的表面积和体积(Java)acm.sdut...

Problem Description计算如下立体图形的表面积和体积。从图中观察&#xff0c;可抽取其共同属性到父类Rect中&#xff1a;长度&#xff1a;l 宽度&#xff1a;h 高度&#xff1a;z在父类Rect中&#xff0c;定义求底面周长的方法length( )和底面积的方法area( )。定义父类Rect…

贝叶斯理论基础理解

从贝叶斯方法谈到贝叶斯网络&#xff1a; http://blog.csdn.net/zdy0_2004/article/details/41096141 1 思考模式 比如往台球桌上扔一个球&#xff0c;这个球落会落在何处呢&#xff1f;如果是不偏不倚的把球抛出去&#xff0c;那么此球落在台球桌上的任一位置都有着相同的机…

java mongodb 关闭连接_如何在mongodb上使用java驱动程序保持连接池关闭?

我正在从java驱动程序2.12.3升级到3.3.0.奇怪的是,收集池似乎突然“起作用”.我的设置如下&#xff1a;Connection在主线程中建立&#xff1a;mongoClient new MongoClient(new MongoClientURI("mongodb://localhost:27017"));mongoClient.setWriteConcern(new Writ…

再论递归

再论递归 大概是从汉诺塔hanoi了解递归算法的&#xff1a; function hanoi(n, a, b, c) {if(n1) {console.log(${a} ---> ${c})return}hanoi(n-1, a, c, b);hanoi(1, a, b, c);hanoi(n-1, b, a, c); }hanoi(10, A, B, C); 我自诩脑回路清奇&#xff0c;然而面对这层层递归&a…