题目描述

给你一个$n$个点$m$条边的带边权的无向图(无重边,无自环),现在对于每条边,问你这条边的权值最大可以是多大,使得这条边在无向图的所有最小生成树中?(边权都是整数)。


输入格式

第一行包含三个整数$n,m,a$表示点数和边数及特殊性质标记(如果$a=0$表示没有特殊性质,如果殊性质)。
接下来$m$行每行包含三个整数$u,v,w$表示有一条$u$和$v$之间的边,且边权为$w$。


输出格式

输出一行,包含$m$个数,第$i$个数表示第$i$条边对应的答案(如果某条边的权值可以取到$+\infty$输出$-1$)。


样例

样例输入1:

4 4 0
1 2 1
2 3 1
3 4 1
4 1 2

样例输出1:

1 1 1 0

样例输入2:

4 3 0
1 2 2
2 3 2
3 4 2

样例输出2:

-1 -1 -1


数据范围与提示

特殊性质:$w=1$(对于所有边);
对于所有数据:$1\leqslant u,v\leqslant n,1\leqslant w\leqslant {10}^9$。


题解

对于一条边,分为两种情况:

  $\alpha.$最小生成树上的边,那么它的最大值就是能代替它的最小边的边权$-1$。

  $\beta.$不是最小生成树上的边,那么它的最大值就是最小生成树上那条边的边权$-1$。

对于如何求,用树链剖分就好了,代码稍长……

数据的输出有点问题,如果不在$1$节点的联通块中则输出$0$。

时间复杂度:$\Theta(n\log^2 n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
#define L(x) x<<1
#define R(x) x<<1|1
using namespace std;
struct node{int fr,to,w,id;bool tr;}b[100001];
struct rec{int nxt,to,w,id;}e[200001];
int head[70001],cnt;
int maxb,dy[70001];
int n,m,a;
int f[70001];
int depth[70001],size[70001],id[70001],w[70001],son[70001],top[70001],pos[70001],fa[70001];
int trmax[280001],trmin[280001],lz[280001];
int ans[100001];
bool cmp(node a,node b){return a.w<b.w;}
void add(int x,int y,int w,int id)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=w;
e[cnt].id=id;
head[x]=cnt;
}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
void pre_dfs(int x)
{
size[x]=1;
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=fa[x])
{
depth[e[i].to]=depth[x]+1;
fa[e[i].to]=x;
dy[e[i].to]=e[i].id;
w[e[i].to]=e[i].w;
pre_dfs(e[i].to);
size[x]+=size[e[i].to];
if(size[e[i].to]>size[son[x]])son[x]=e[i].to;
}
}
void pro_dfs(int x,int tp)
{
top[x]=tp;
id[x]=++cnt;
pos[cnt]=x;
if(son[x])pro_dfs(son[x],tp);
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=fa[x]&&e[i].to!=son[x])pro_dfs(e[i].to,e[i].to);
}
void build(int x,int l,int r)
{
trmin[x]=lz[x]=maxb+1;
if(l==r)
{
trmax[x]=w[pos[l]];
return;
}
int mid=(l+r)>>1;
build(L(x),l,mid);
build(R(x),mid+1,r);
trmax[x]=max(trmax[L(x)],trmax[R(x)]);
}
void pushdown(int x)
{
if(lz[x]==maxb+1)return;
trmin[L(x)]=min(trmin[L(x)],lz[x]);
trmin[R(x)]=min(trmin[R(x)],lz[x]);
lz[L(x)]=min(lz[L(x)],lz[x]);
lz[R(x)]=min(lz[R(x)],lz[x]);
lz[x]=1<<30;
}
int ask(int x,int l,int r,int L,int R)
{
if(R<l||r<L)return 0;
if(L<=l&&r<=R)return trmax[x];
int mid=(l+r)>>1;
return max(ask(L(x),l,mid,L,R),ask(R(x),mid+1,r,L,R));
}
int query(int x,int y)
{
int ret=0;
while(top[x]!=top[y])
{
if(depth[top[x]]<depth[top[y]])swap(x,y);
ret=max(ret,ask(1,1,n,id[top[x]],id[x]));
x=fa[top[x]];
}
if(depth[x]>depth[y])swap(x,y);
if(id[x]<id[y])ret=max(ret,ask(1,1,n,id[x]+1,id[y]));
return ret;
}
void change(int x,int l,int r,int L,int R,int w)
{
if(R<l||r<L)return;
if(L<=l&&r<=R)
{
trmin[x]=min(trmin[x],w);
lz[x]=min(lz[x],w);
return;
}
int mid=(l+r)>>1;
pushdown(x);
change(L(x),l,mid,L,R,w);
change(R(x),mid+1,r,L,R,w);
trmin[x]=min(trmin[L(x)],trmin[R(x)]);
}
int update(int x,int y,int w)
{
int ret=0;
while(top[x]!=top[y])
{
if(depth[top[x]]<depth[top[y]])swap(x,y);
change(1,1,n,id[top[x]],id[x],w);
x=fa[top[x]];
}
if(depth[x]>depth[y])swap(x,y);
if(id[x]<id[y])change(1,1,n,id[x]+1,id[y],w);
return ret;
}
void getans(int x,int l,int r)
{
if(l==r)
{
ans[dy[pos[l]]]=trmin[x];
if(ans[dy[pos[l]]]==maxb+1)ans[dy[pos[l]]]=0;
ans[dy[pos[l]]]--;
return;
}
int mid=(l+r)>>1;
pushdown(x);
getans(L(x),l,mid);
getans(R(x),mid+1,r);
}
int main()
{
scanf("%d%d%d",&n,&m,&a);
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
b[i]=(node){x,y,w,i,0};
maxb=max(maxb,w);
}
sort(b+1,b+m+1,cmp);
for(int i=1;i<=m;i++)
if(find(b[i].fr)!=find(b[i].to))
{
f[find(b[i].fr)]=find(b[i].to);
add(b[i].fr,b[i].to,b[i].w,b[i].id);
add(b[i].to,b[i].fr,b[i].w,b[i].id);
b[i].tr=1;
}
cnt=0;
pre_dfs(1);
pro_dfs(1,1);
build(1,1,n);
for(int i=1;i<=m;i++)
if(!b[i].tr)
{
ans[b[i].id]=query(b[i].fr,b[i].to)-1;
update(b[i].fr,b[i].to,b[i].w);
}
getans(1,1,n);
for(int i=1;i<=m;i++)printf("%d ",ans[i]);
return 0;
}

rp++

[CSP-S模拟测试]:weight(Kruskal+树链剖分)的更多相关文章

  1. NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】

    NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...

  2. 2019.01.20 bzoj2238: Mst(kruskal+树链剖分)

    传送门 树链剖分菜题. 题意简述:给一个无向图,边有边权,每次询问删一条边(对后面的询问无影响)之后的最小生成树. 思路: 先跑一次kruskalkruskalkruskal并把跑出来的最小生成树给链 ...

  3. [CSP-S模拟测试]:party?(霍尔定理+最小割+树链剖分)

    题目描述 $Treeland$国有$n$座城市,其中$1$号城市是首都,这些城市被一些单向高铁线路相连,对于城市$i\neq 1$,有一条线路从$i$到$p_i(p_i<i)$.每条线路都是一样 ...

  4. BZOJ2040[2009国家集训队]拯救Protoss的故乡——模拟费用流+线段树+树链剖分

    题目描述 在星历2012年,星灵英雄Zeratul预测到他所在的Aiur行星在M天后会发生持续性暴雨灾害,尤其是他们的首都.而Zeratul作为星灵族的英雄,当然是要尽自己最大的努力帮助星灵族渡过这场 ...

  5. [HDU3710] Battle Over Cities [树链剖分+线段树+并查集+kruskal+思维]

    题面 一句话题意: 给定一张 N 个点, M 条边的无向连通图, 每条边上有边权 w . 求删去任意一个点后的最小生成树的边权之和. 思路 首先肯定要$kruskal$一下 考虑$MST$里面去掉一个 ...

  6. 【Codeforces827D/CF827D】Best Edge Weight(最小生成树性质+倍增/树链剖分+线段树)

    题目 Codeforces827D 分析 倍增神题--(感谢T*C神犇给我讲qwq) 这道题需要考虑最小生成树的性质.首先随便求出一棵最小生成树,把树边和非树边分开处理. 首先,对于非树边\((u,v ...

  7. [BZOJ2164]采矿【模拟+树链剖分+线段树】

    Online Judge:Bzoj2164 Label:模拟,树链剖分,线段树 题目描述 浩浩荡荡的cg大军发现了一座矿产资源极其丰富的城市,他们打算在这座城市实施新的采矿战略.这个城市可以看成一棵有 ...

  8. jzoj4918. 【GDOI2017模拟12.9】最近公共祖先 (树链剖分+线段树)

    题面 题解 首先,点变黑的过程是不可逆的,黑化了就再也洗不白了 其次,对于\(v\)的祖先\(rt\),\(rt\)能用来更新答案当且仅当\(sz_{rt}>sz_{x}\),其中\(sz\)表 ...

  9. jzoj5987. 【WC2019模拟2019.1.4】仙人掌毒题 (树链剖分+概率期望+容斥)

    题面 题解 又一道全场切的题目我连题目都没看懂--细节真多-- 先考虑怎么维护仙人掌.在线可以用LCT,或者像我代码里先离线,并按时间求出一棵最小生成树(或者一个森林),然后树链剖分.如果一条边不是生 ...

随机推荐

  1. JNI-java native interface(java本地接口)

    什么是JNI java native interface(java本地接口) ABI: application binary interface (应用程序二进制接口) 为什么要使用JNI * 复用很 ...

  2. Vue Cli 3:创建项目

    一 简介 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,有几个独立的部分. 1 CLI (@vue/cli) 是一个全局安装的 npm 包,提供了终端里的 vue 命令.(vue ...

  3. Mac获取Jenkins管理员初始密码

    前言 最近在配置jenkins环境,但是启动jenkins后,进入jenkins解锁页时,需要自己获取初始密码. 尝试在访达中输入地址搜索,结果无该文件.后来百度上查看多篇文章后,终于获取到了初始密码 ...

  4. Python3-问题整理

    TypeError: a bytes-like object is required, not 'str' json.decoder.JSONDecodeError: Extra data json文 ...

  5. C# 中定义斜杠 \

    \ 是转义符 如     \’ 单引号    \” 双引号    \\ 反斜杠    \0 空    \a 警告(产生峰鸣)    \b 退格    \f 换页    \n 换行    \r 回车   ...

  6. linux操作系统的调度策略

    linux的进程分为两种 1.实时进程,优先级高,操作系统会优先执行这种进程 2.普通进程,大多数的进程都是这种进程 调度策略 unsigned int policy; 调度策略的定义 #define ...

  7. FireFox浏览器导出文件名乱码

    解决方案1 String codedFileName = "导出文件名.xls"; String agent = request.getHeader("USER-AGEN ...

  8. [fw]拦截系统调用

    今天在ubuntu中玩了下“拦截系统调用”,记录下自己对整个实现的理解. 原理 在linux kernel中,系统调用都放在一个叫做“sys_call_table”的分配表里面,在进入一个系统调用的最 ...

  9. Android APP 登陆模块

    首先我想强调一点.这个登陆的模块最好是放在另外一个线程里面来实现.否则有可能会爆出一系列的问题, 然后再与主UI 交互.这样就不会爆ANR异常 1.对于登陆模块的.首先大体的逻辑肯定是要清晰的.    ...

  10. JSTL报错Unable to read TLD "META-INF/c.tld" from JAR file "file.............................

    **********菜鸟的福利^_^************ 我用的是jstl-1.2.jar,网上很多说法是删掉工程lib下面的两个jar包,那是之前的老版本,现在整合成一个了. 我出现这个问题的原 ...