题目名称 573. 存在与否
输入输出 exists.in/out
难度等级 ★★★
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 20
题目来源 Gravatarcqw 于2011-07-24加入
开放分组 全部用户
提交状态
分类标签
分享题解
通过:0, 提交:1, 通过率:0%
Gravatarmaxinyang 0 0.000 s 0.17 MiB Pascal
本题关联比赛
20110725
关于 存在与否 的近10条评论(全部评论)

573. 存在与否

★★★   输入文件:exists.in   输出文件:exists.out   简单对比
时间限制:1 s   内存限制:128 MiB

【问题描述

当前,随着经济的深入变革,我们的社会环境也得到了很大改善,在中国,城市人口每年以7%的速度增长,一些大城市的人口增长速度更是快的惊人,一个显而易见的例子是:今天的上海每小时新增加10所住宅和100平方米的公路,已率先成为世界大都市。
由于人口和城市面积的急剧增长,公共交通成为一个重要的问题,于是大量的十字路口遍步整个城市。
举个例子,以前广州海珠区有N个自然村,有一些道路把这些村子连接起来,使得任意两个村子都存在一条路径相通,任意两条路只在某个村子那里相交。简单来说,海珠区可以被视为一棵树,村子是结点,路为边,海珠区政府就位于树的根结点所在的村子。这棵树有M个叶子结点(L[1],...,L[M],换言之,这M个村子中的每一个都只与一个村子直接相连),其它(N-M)个结点(包括根结点)每一个结点都至少有两个子结点,如下图1所示。
近年来,又新建了一条环状交叉路穿过了这M个村子(L[1],...,L[M]),如图2所示:

图1                                                            图2
假定L[0]是一个离海珠区很远的邮局,但也在环路上。邮递员想以尽可能快的速度往各个村子送EMS,从统计数据中你可得知邮递员走每条路需花费的时间,现在邮局局长想知道是否存在一个环(L[0]→L[1]→...→L[M]→L[0]),使得邮递员只需访问这N个村子中的每个村子一次,如果可行,输出完成这个任务所花费的最小时间,否则只需输出“-1”(双引号不需输出)。
【输入格式】
输入数据有两部分组成:
第一部分的第一行是一个正整数N(3≤N≤1000),表示村子的个数,接下来有N-1行,第i行有三个正整数Xi(1≤Xi≤N),Yi(1≤Yi≤N),Ti(0< Ti≤1000),用来描述第i条边,其中Yi为树中Xi的父结点,Ti表示从Xi到Yi或者从Yi到Xi所需的时间。
第二部分的第一行是一个正整数M(1≤M< N),表示叶子结点的个数,接下来有M+1行,表示交叉路,第i(0≤i≤M)行有三个非负整数L[i](0≤L[i]≤N),L[i+1](0≤L[i+1]≤N),Ci(0< Ci≤1000),假定L[0]=L[M+1]=0,交叉路是一个环L[0]→L[1]→L[2]→...→L[M]→L[M+1],Ci表示从L[i]到L[i+1]或者从L[i+1]到L[i]所需的时间。
【输出格式】

输出只有一个整数,如果存在一个满足上述要求的环,输出从邮局出发遍历所有村子并返回邮局所需的最小时间,否则输出“-1”(不包括双引号),输出不需要多余的空格。

【输入样例】
输入文件名:exists.in
3
2 1 1
3 1 1
2
0 2 1
2 3 1
3 0 1
输出文件名:exists.out
4
提示:可行的环为0→2→1→3→0,总的时间为4,如下图: