题意:

给一棵树,边权未知,现在给m组约束,每组约束给出从u到v路径中的最小值,现在让你给出一组边权,使得符合之前的约束,不能给出输出-1

思路:

因为n较小,对于每组约束我们可以直接暴力修改路径上的权值,如果边的权值小于当前约束的最小值,则将权值修改,最后再根据每组约束暴力走一遍路径看路径是否满足要求,如果不满足则输出-1,最后还得对那些没有修改过的边随意赋值

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=;
int id[maxn][maxn],edge[maxn][maxn],fa[maxn],f[maxn],dep[maxn];
//id记录从i到j这条边的编号,edge记录边的权值,fa记录i的父亲是谁,f记录边的权值 ,dep记录深度
vector<int> a[maxn];
int from[maxn],to[maxn],mi[maxn];
int n,m,u,v,w;
void dfs(int x,int p)//处理出父亲与深度
{
fa[x]=p,dep[x]=dep[p]+;
for(int i=;i<a[x].size();i++)
if(a[x][i]!=p) dfs(a[x][i],x);
}
void dfs2(int x,int p)
{
for(int i=;i<a[x].size();i++){
if(a[x][i]!=p){
int to=a[x][i];
f[id[x][to]]=edge[x][to];
dfs2(a[x][i],x);
}
}
}
void solve()
{
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d%d",&from[i],&to[i],&mi[i]);
if(dep[from[i]]<dep[to[i]]) swap(from[i],to[i]);
int k1=from[i],k2=to[i],mini=mi[i];
while(dep[k1]!=dep[k2]){
int p=fa[k1];
if(edge[p][k1]<=mini) edge[p][k1]=edge[k1][p]=mini;
k1=p;
}
while(k1!=k2){
int p1=fa[k1],p2=fa[k2];
if(edge[p1][k1]<=mini) edge[p1][k1]=edge[k1][p1]=mini;
if(edge[p2][k2]<=mini) edge[p2][k2]=edge[k2][p2]=mini;
k1=p1,k2=p2;
}
}
for(int i=;i<=m;i++){
int x=inf;
int k1=from[i],k2=to[i],mini=mi[i];
if(dep[k1]<dep[k2]) swap(k1,k2);
while(dep[k1]!=dep[k2]){
int p=fa[k1];
x=min(x,edge[p][k1]);
k1=p;
}
while(k1!=k2){
int p1=fa[k1],p2=fa[k2];
x=min(x,edge[p1][k1]);
x=min(x,edge[p2][k2]);
k1=p1,k2=p2;
}
if(x!=mini){ cout<<-<<endl;return;}
}
dfs2(,);
for(int i=;i<n;i++){
if(!f[i]) cout<<<<" ";
else cout<<f[i]<<" ";
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d%d",&u,&v);
a[u].push_back(v);
a[v].push_back(u);
id[u][v]=id[v][u]=i;
}
dfs(,);
solve();
return ;
}

Codeforces Round #617 (Div. 3)F. Berland Beauty的更多相关文章

  1. Codeforces Round #496 (Div. 3) F - Berland and the Shortest Paths

    F - Berland and the Shortest Paths 思路:还是很好想的,处理出来最短路径图,然后搜k个就好啦. #include<bits/stdc++.h> #defi ...

  2. Codeforces Round #485 (Div. 2) F. AND Graph

    Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...

  3. Codeforces Round #486 (Div. 3) F. Rain and Umbrellas

    Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...

  4. Codeforces Round #501 (Div. 3) F. Bracket Substring

    题目链接 Codeforces Round #501 (Div. 3) F. Bracket Substring 题解 官方题解 http://codeforces.com/blog/entry/60 ...

  5. 构造 Codeforces Round #Pi (Div. 2) B. Berland National Library

    题目传送门 /* 题意:给出一系列读者出行的记录,+表示一个读者进入,-表示一个读者离开,可能之前已经有读者在图书馆 构造:now记录当前图书馆人数,sz记录最小的容量,in数组标记进去的读者,分情况 ...

  6. Codeforces Round #499 (Div. 1) F. Tree

    Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...

  7. [CF百场计划]Codeforces Round #617 (Div. 3)

    A. Array with Odd Sum Description You are given an array \(a\) consisting of \(n\) integers. In one ...

  8. Codeforces Round #376 (Div. 2)F. Video Cards(前缀和)

    题目链接:http://codeforces.com/contest/731/problem/F 题意:有n个数,从里面选出来一个作为第一个,然后剩下的数要满足是这个数的倍数,如果不是,只能减小为他的 ...

  9. Codeforces Round #271 (Div. 2) F. Ant colony (RMQ or 线段树)

    题目链接:http://codeforces.com/contest/474/problem/F 题意简而言之就是问你区间l到r之间有多少个数能整除区间内除了这个数的其他的数,然后区间长度减去数的个数 ...

随机推荐

  1. 支撑百万级并发,Netty如何实现高性能内存管理

    Netty作为一款高性能网络应用程序框架,实现了一套高性能内存管理机制 通过学习其中的实现原理.算法.并发设计,有利于我们写出更优雅.更高性能的代码:当使用Netty时碰到内存方面的问题时,也可以更高 ...

  2. jsqlparser和calcite和druid功能对比

    需求分析:(用其它方法替代metabase中的某些功能)功能1.通过对sql查询语句的分析,得到所有表名,以及所有表的字段名,字段类型,字段注解信息.功能2.在sql语句执行查询前,校验sql语句是否 ...

  3. alpha week 2/2 Scrum立会报告+燃尽图 06

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9803 小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶, ...

  4. vue实现下拉框全选和输入匹配

    实际项目中的一个需求: 点击文本框,弹出带有复选框的选项,然后获取选中项的数据,传给后面的一个功能.在文本框输入内容,也会动态的匹配下拉列表,并且列表带有全选功能. 朴素的效果图: 我选择了用vue实 ...

  5. $Poj3208$ 启示录 数位统计$DP$

    Poj  AcWing Description Sol  这题长得就比较像数位$DP$叭. 所以先用$DP$进行预处理,再基于拼凑思想,通过"试填法"求出最终的答案. 设$F[i] ...

  6. Pandas 数据分析,高中体测练习

    分析体测成绩 需求: 体侧成绩转变成分数 开卷考试 excel完成可以 pandas读取excel代码中 完成 一个手输入 进一步,画图,分布,体重正常,肥胖,偏瘦比例,绘制饼图 男生跑步1000成绩 ...

  7. Atom + Texlive 配置 Latex 环境

    Atom + Texlive 配置 Latex 环境 步骤1: 安装TexliveTexlive点击 "Download" 下载,然后安装,等待安装完成即可 步骤2: 安装Atom ...

  8. ACM北大暑期课培训第二天

    今天继续讲的动态规划 ... 补充几个要点: 1. 善于利用滚动数组(可减少内存,用法与计算方向有关) 2.升维 3.可利用一些数据结构等方法使代码更优  (比如优先队列) 4.一般看到数值小的 (十 ...

  9. 【转】ArcGIS Server 站点架构-Web Adaptor

    GIS 服务器内置了Web服务器,如果我想用我自己企业内部的服务器,该怎么做? 多个GIS服务器集群又如何做? …… 有问题,说明我们在思考,这也是我们希望看到的,因为只有不断的思考,不断的问自己为什 ...

  10. 记录一下第一次用markdown写博客回滚过程

    前面写博客,一直用的是博客园的TinyMCE编辑器, 今天不知道哪根筋搭牢了,想试试用Markdown写. 于是在“选项”里面把默认编辑器修改为“Markdown”,鉴于本人有一定的Markdown基 ...