题解:
显然任意所求路径就只经过一条密道,然后呢,画图发现就是一个个环,然后可以用并查集来维护属于一个环或者是直接赋值
#include<bits/stdc++.h>
using namespace std;
long long read() {
long long num=0;
char ch=getchar();
while(ch>'9'||ch<'0') {
ch=getchar();
}
while(ch>='0'&&ch<='9') {
num=(num<<1)+(num<<3)+ch-'0';
ch=getchar();
}
return num;
}
struct oo{
int next;
int ver;
int id;
}edge[200005];
struct ooo{
int s;
int e;
int val;
}md[200005];
int head[100005],tot,d[100005],fa[100005],up[100005],in[100005],ans[100005];
void dfs(int now){
for(int i=head[now];i;i=edge[i].next){
int y=edge[i].ver;
if(d[y])continue;
d[y]=d[now]+1;
in[y]=edge[i].id;
fa[y]=now;
dfs(y);
}
}
void add(int a,int b,int c){
edge[++tot].next=head[a];
edge[tot].ver=b;
edge[tot].id=c;
head[a]=tot;
}
bool cmp(ooo a,ooo b){
return a.val<b.val;
}
int finds(int x){
if(up[x]!=x)
up[x]=finds(up[x]);
return up[x];
}
int main(){
int n,m,a,b;
n=read();
m=read();
for(int i=1;i<n;i++){
a=read(),b=read();
add(a,b,i);
add(b,a,i);
}
d[1]=1;
dfs(1);
for(int i=1;i<=m;i++){
md[i].s=read();
md[i].e=read();
md[i].val=read();
}
sort(md+1,md+m+1,cmp);
for(int i=1;i<=n;i++)
up[i]=i;
for(int i=1;i<=m;i++){
int u=finds(md[i].s),v=finds(md[i].e);
while(u!=v){
if(d[u]<d[v])swap(u,v);
ans[in[u]]=md[i].val;
u=up[finds(u)]=finds(fa[u]);
}
}
for(int i=1;i<n;i++){
if(ans[i])
printf("%d\n",ans[i]);
else
puts("-1");
}
return 0;
}