hdu 4871 树的分治+最短路记录路径
/*
题意:给你一些节点和一些边,求最短路径树上是k个节点的最长的路径数。
解:1、求出最短路径树--spfa加记录
2、树上进行操作--树的分治,分别处理子树进行补集等运算
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#define ll __int64
using namespace std;
#define N 31000
#define inf 10000000000000000
ll kk;
struct node {
ll u,v,w,next;
}bian[N*4];
ll yong,head[N];
void init() {
yong=0;
memset(head,-1,sizeof(head));
}
void addedge(ll u,ll v,ll w) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
ll Min(ll v,ll vv) {
return v>vv?vv:v;
}
ll premi[N],val[N];//用来记录前一个元素的字典序最小和前一条边的权值
void spfa(ll u,ll n) {
ll i,cur,dis[N],vis[N];
queue<ll>q;
for(i=1;i<=n;i++)
dis[i]=inf;
memset(vis,0,sizeof(vis));
memset(premi,-1,sizeof(premi));
dis[u]=0;
q.push(u);
while(!q.empty()) {
cur=q.front();
q.pop();
vis[cur]=0;
for(i=head[cur];i!=-1;i=bian[i].next) {
ll v=bian[i].v;
if(dis[v]>dis[cur]+bian[i].w) {
dis[v]=dis[cur]+bian[i].w;
val[v]=bian[i].w;
premi[v]=cur;//记录前一个节点
if(!vis[v]) {
vis[v]=1;
q.push(v);
}
}
else
if(dis[v]==dis[cur]+bian[i].w) {
if(premi[v]==-1)premi[v]=cur;
else
premi[v]=Min(premi[v],cur);
}
}
} return ;
}
/*以下是树的分治部分*/
ll minn,ma,num[N],nn,diss[N],len,mxx,mxnum,vis[N],ed[N];
void dfs1(ll u,ll fa) {
ll i;
nn++;
for(i=head[u];i!=-1;i=bian[i].next) {
ll v=bian[i].v;
if(v!=fa&&!vis[v])
dfs1(v,u);
}
return ;
}
ll Max(ll v,ll vv) {
return v>vv?v:vv;
}
void dfs2(ll u,ll fa) {
num[u]=1;
ll i,tit=0;
for(i=head[u];i!=-1;i=bian[i].next) {
ll v=bian[i].v;
if(v!=fa&&!vis[v]) {
dfs2(v,u);
num[u]+=num[v];
tit=Max(tit,num[v]);
}
}
tit=Max(tit,nn-num[u]);
if(tit<minn) {
minn=tit;
ma=u;
}
return;
}
void dfs4(ll u,ll fa,ll w,ll aa) {
diss[++len]=w;
ed[len]=aa;
ll i;
for(i=head[u];i!=-1;i=bian[i].next) {
ll v=bian[i].v;
if(v!=fa&&!vis[v])
dfs4(v,u,w+bian[i].w,aa+1);
}
return;
}
struct nodee {//用来记录补集
ll dis;
ll num;
}f[N];
void dfs3(ll u) {
ll i,k,j;
if(nn<kk)return ;
for(i=0;i<=nn;i++)
f[i].dis=0,f[i].num=0;
for(i=head[u];i!=-1;i=bian[i].next) {
ll v=bian[i].v;
if(vis[v])continue;
len=0;
// printf("v=%I64d w=%I64d\n",v,bian[i].w);
dfs4(v,-1,bian[i].w,1);//因为这里实际是两个节点但是要把它看成一个节点
// printf("len=%I64d\n",len);
for(j=1;j<=len;j++) {
// printf("z%I64d %I64d %I64d\n",j,ed[j],diss[j]);
if(ed[j]+1==kk) {//和当前子树比较
if(diss[j]>mxx) {
mxx=diss[j];
mxnum=1;
}
else
if(diss[j]==mxx)
mxnum++;
}
if(kk-ed[j]-1<=0)continue;
k=diss[j]+f[kk-ed[j]].dis;//补集
// printf("khe=%I64d\n",k);
if(k>mxx) {
mxx=k;
mxnum=f[kk-ed[j]].num;
}
else
if(k==mxx)
mxnum+=f[kk-ed[j]].num;
}
for(j=1;j<=len;j++) {//加入补集
if(ed[j]+1>=kk)continue;
if(f[ed[j]+1].dis<diss[j]) {//节点数要加一加入
f[ed[j]+1].dis=diss[j];
f[ed[j]+1].num=1;
}
else if(f[ed[j]+1].dis==diss[j])
f[ed[j]+1].num++;
}
}
//printf("%I64d %I64d\n",mxx,mxnum);
return ;
}
void dfs(ll u) {
minn=inf;
nn=0;
dfs1(u,-1);
dfs2(u,-1);
//printf("minn=%I64d %I64d\n",minn,ma);
vis[ma]=1;
dfs3(ma);
ll i;
for(i=head[ma];i!=-1;i=bian[i].next) {
ll v=bian[i].v;
if(!vis[v])
dfs(v);
}
return;
}
int main() {
ll t,n,m,i,j,k;
scanf("%I64d",&t);
while(t--) {
init();
scanf("%I64d%I64d%I64d",&n,&m,&kk);
while(m--) {
scanf("%I64d%I64d%I64d",&i,&j,&k);
addedge(i,j,k);
addedge(j,i,k);
}
if(kk==1) {//是1的时候特殊处理
printf("0 %I64d\n",n);
continue;
}
spfa(1,n);//求最短路
//prllf("z");
init();
for(i=2;i<=n;i++) {//建立最短路径树
addedge(i,premi[i],val[i]);
addedge(premi[i],i,val[i]);
}
// for(i=0;i<yong;i++)
// printf("%I64d %I64d %I64d\n",bian[i].u,bian[i].v,bian[i].w);
memset(vis,0,sizeof(vis));
mxx=-1;mxnum=0;//用来记录最长值和路径数
dfs(1);
printf("%I64d %I64d\n",mxx,mxnum);
}
return 0;}
hdu 4871 树的分治+最短路记录路径的更多相关文章
- HDOJ 5294 Tricks Device 最短路(记录路径)+最小割
最短路记录路径,同一时候求出最短的路径上最少要有多少条边, 然后用在最短路上的边又一次构图后求最小割. Tricks Device Time Limit: 2000/1000 MS (Java/Oth ...
- hdu 4670 树的分治-求点对的个数
/* 树的分治 因为树的点权值可达到10^15,注意手动扩栈,还有int64 题意:给你一棵树,给你一些素数,给你每个点一个权值且每个权值均可由这些素数组成.现在定义任意任意两点的价值为他们路径上的权 ...
- HDU 1385 Minimum Transport Cost( Floyd + 记录路径 )
链接:传送门 题意:有 n 个城市,从城市 i 到城市 j 需要话费 Aij ,当穿越城市 i 的时候还需要话费额外的 Bi ( 起点终点两个城市不算穿越 ),给出 n × n 大小的城市关系图,-1 ...
- HDU 1160 FatMouse's Speed(要记录路径的二维LIS)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 4606 Occupy Cities (计算几何+最短路+最小路径覆盖)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题目:给出n个城市需要去占领,有m条线段是障碍物, ...
- uva 11374 最短路+记录路径 dijkstra最短路模板
UVA - 11374 Airport Express Time Limit:1000MS Memory Limit:Unknown 64bit IO Format:%lld & %l ...
- 题解报告:hdu 1160 FatMouse's Speed(LIS+记录路径)
Problem Description FatMouse believes that the fatter a mouse is, the faster it runs. To disprove th ...
- HDU - 1160 最长上升子序列以及记录路径
题意:第一列,给出老鼠的重量,第二列,给出老鼠的速度,要证明老鼠的重量越大,速度越小,给出最多老鼠的数量,并说明第几只. 思路:先将老鼠按照重量从大到小排序,然后速度是从小到大,求最长上升子序列,学习 ...
- HDU1026--Ignatius and the Princess I(BFS记录路径)
Problem Description The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius has ...
随机推荐
- synchronized(2)修饰方法之:普通方法
synchronized方法 [同一个对象的该方法一次只有一个线程可以访问,该对象的其它同步方法也被阻塞] 方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.这时, ...
- 操作JavaScript的Alert弹框
@Testpublic void testHandleAlert(){ WebElement button =driver.findElement(By.xpath("input" ...
- jmeter(十五)Jmeter默认报告优化
一.本文目的: 之前写了两篇文章搭建持续集成接口测试平台(Jenkins+Ant+Jmeter)和ANT批量执行Jmeter脚本,功能实现上都没有什么问题,但是最后生成的报告有一点小问题,虽然不影响使 ...
- AJPFX:学习JAVA程序员两个必会的冒泡和选择排序
* 数组排序(冒泡排序)* * 冒泡排序: 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处* * 选择排序 : 从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现 ...
- 《effective java》中文第2版 note
,第15条[66]: 为不可变类提供静态工厂, eg : Integer/BigInteger 使用了静态工厂缓存了一些常用的实例, 通常 Integer -128 ~ +127. BigIntege ...
- [POJ1509]Glass Beads 后缀自动机 最小循环串
题目链接:http://poj.org/problem?id=1509 题目意思就是求循环字符串的最小表示. 我们用字符串S+S建立SAM,然后从root开始走n步,每次尽量选最小的. 由于 SAM ...
- Pycharm+Django+Python+MySQL开发 后台管理数据库
Django框架十分简单易用,适合搭建个人博客网站.网上有很多教程,大多是关于命令行操作Django,这里分享一些用最新工具进行Django开发过程,主要是PyCharm太强大,不用有点可惜. 第一次 ...
- VS2010 好用的javascript扩展工具
工具1) JScript Editor Extensions 折叠代码 下载地址: JScript Editor Extensions 工具2) Javascript parser 以树形方式查的代码 ...
- ubuntu服务器建立apache虚拟主机
启用与停用站点的方法 a2ensite 站点名 a2dissite 站点名 基于名字的(通过域名来区分)的虚拟主机 安装好apache以后默认有一个叫default的虚拟主机.新建虚拟主机时可以直接复 ...
- webpac入门
基于node环境,必须确保node已经安装:node-v,npm-v 基础入门 前身:browserify 缺点:只能转化JS webpack作用:一切都是模块化(js.css图片等),一个模块加载器 ...