EZOJ #386 最小生成树
分析
先建出最小生成树
之后每次倍增找环即可
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node {
int x,y,z,is,id;
};
node d[];
int head[],nxt[],to[],w[],cnt,res,dep[];
int pr[][],sum[][],n,m,ans[],fa[],tot;
inline void add(int x,int y,int z){
nxt[++cnt]=head[x];
head[x]=cnt;
to[cnt]=y;
w[cnt]=z;
nxt[++cnt]=head[y];
head[y]=cnt;
to[cnt]=x;
w[cnt]=z;
}
inline void dfs(int x,int fa){
dep[x]=dep[fa]+;
pr[x][]=fa;
for(int i=head[x];i;i=nxt[i])
if(to[i]!=fa)sum[to[i]][]=w[i],dfs(to[i],x);
}
inline int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
int len=dep[x]-dep[y],wh=;
for(int i=;i<=;i++)
if((<<i)&len)wh=max(wh,sum[x][i]),x=pr[x][i];
if(x==y)return wh;
for(int i=;i>=;i--)
if(pr[x][i]!=pr[y][i]){
wh=max(wh,max(sum[x][i],sum[y][i]));
x=pr[x][i];
y=pr[y][i];
}
wh=max(wh,max(sum[x][],sum[y][]));
return wh;
}
inline bool cmp(const node a,const node b){return a.z<b.z;}
inline int sf(int x){return fa[x]==x?x:fa[x]=sf(fa[x]);}
signed main(){
int i,j,k;
scanf("%lld%lld",&n,&m);
for(i=;i<=m;i++){
scanf("%lld%lld%lld",&d[i].x,&d[i].y,&d[i].z);
d[i].id=i;
}
for(i=;i<=n;i++)fa[i]=i;
sort(d+,d+m+,cmp);
for(i=;i<=m;i++){
int x=d[i].x,y=d[i].y;
if(sf(x)==sf(y))continue;
fa[sf(y)]=sf(x);
add(x,y,d[i].z);
res+=d[i].z;
tot++;
d[i].is=;
if(tot==n-)break;
}
dfs(,);
for(i=;i<=;i++)
for(j=;j<=n;j++)
pr[j][i]=pr[pr[j][i-]][i-],
sum[j][i]=max(sum[j][i-],sum[pr[j][i-]][i-]);
for(i=;i<=m;i++){
if(d[i].is)ans[d[i].id]=res;
else ans[d[i].id]=res+d[i].z-lca(d[i].x,d[i].y);
}
for(i=;i<=m;i++)printf("%lld\n",ans[i]);
return ;
}
EZOJ #386 最小生成树的更多相关文章
- 图的全部实现(邻接矩阵 邻接表 BFS DFS 最小生成树 最短路径等)
1 /** 2 * C: Dijkstra算法获取最短路径(邻接矩阵) 3 * 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> ...
- 最小生成树(Kruskal算法-边集数组)
以此图为例: package com.datastruct; import java.util.Scanner; public class TestKruskal { private static c ...
- 最小生成树计数 bzoj 1016
最小生成树计数 (1s 128M) award [问题描述] 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一 ...
- poj 1251 Jungle Roads (最小生成树)
poj 1251 Jungle Roads (最小生成树) Link: http://poj.org/problem?id=1251 Jungle Roads Time Limit: 1000 ...
- 【BZOJ 1016】【JSOI 2008】最小生成树计数
http://www.lydsy.com/JudgeOnline/problem.php?id=1016 统计每一个边权在最小生成树中使用的次数,这个次数在任何一个最小生成树中都是固定的(归纳证明). ...
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- Delaunay剖分与平面欧几里得距离最小生成树
这个东西代码我是对着Trinkle的写的,所以就不放代码了.. Delaunay剖分的定义: 一个三角剖分是Delaunay的当且仅当其中的每个三角形的外接圆内部(不包括边界)都没有点. 它的存在性是 ...
- 最小生成树(prim&kruskal)
最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改.先把算法过程记下来: prime算法: 原始的加权连通图——————D被选作起点,选与之相连的权值 ...
- 最小生成树 prime poj1258
题意:给你一个矩阵M[i][j]表示i到j的距离 求最小生成树 思路:裸最小生成树 prime就可以了 最小生成树专题 AC代码: #include "iostream" #inc ...
随机推荐
- [转]JavaScript构造函数及原型对象
JavaScript中没有类的概念,所以其在对象创建方面与面向对象语言有所不同. JS中对象可以定义为”无序属性的集合”.其属性可以包含基本值,对象以及函数.对象实质上就是一组没有特定顺序的值,对象中 ...
- JMeter学习笔记16-如何输出HTML格式的性能测试报告
文本来学习下,如何输入HTML格式的JMeter测试报告.前面已经介绍, 如果要做性能测试,需要在GUI上设计好你的Test Plan,设置各种场景和负载值,包括多少个线程,多少个用户,循环多少次.设 ...
- Windows + Ubuntu 16.04 双系统安装详细教程(转)
转载自:http://www.cnblogs.com/Duane/p/6776302.html 前言:本篇文章是对之前文章的更新,更新的主内容是把原来用手机拍摄的图片换成了虚拟机的截图,以及对磁盘划分 ...
- Yarn 工作机制
1.工作机制详述 (1)MR程序提交到客户端所在的节点. (2)YarnRunner向ResourceManager申请一个Application. (3)RM将该应用程序的资源路径返回给YarnRu ...
- java_第一年_JDBC(7)
Commons-dbutils是一个开源的JDBC工具类库,对JDBC进行封装,简化编码的工作量,包含的API: org.apache.commons.dbutils.QueryRunner org. ...
- [2019杭电多校第八场][hdu6667]Roundgod and Milk Tea
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6667 题目大意是说n个班级,每个班级有ai人和bi杯茶,每个人只能喝其他班的茶并且只能喝一杯.问最多有 ...
- Linux mint启用内核转储
1.查看当前是否启动了内核转储: star@sky:~$ ulimit -c unlimited 2.如果上面显示为0,即没有开启,那么,直接执行 ulimit -c unlimited 就好了. 3 ...
- 网络拓扑_VLAN与Trunk配置
实验目的: 1.实现VLAN10的两台主机互通; VLAN20的两台主机互通; 2.VLAN10与VLAN20主机不能互通. 拓扑图: 步骤: 1.依图配置PC1,PC2,PC3,PC4的IP,掩码, ...
- devops持续集成,Centos7.6下gitlab+jenkins(pipeline)实现代码自动上线
持续集成 gitlab+jenkins(pipeline)实现代码自动上线 环境准备:Centos7.6版本ip:192.168.0.13 主机名:gitip:192.168.0.23 主机名:jen ...
- Flutter-網絡請求
Flutter 请求网络的三种方式 flutter 请求网络的方式有三种,分别是 Dart 原生的网络请求 HttpClient.第三方网络请求 http以及 Flutter 中的 Dio.我们可以比 ...