列表

详情


NC15522. 武

描述

其次,Sεlιнα(Selina) 要进行体力比武竞赛。
Sεlιнα 所在的城市,有 个街区,编号为 ,总共有 条的街道连接这些街区, 使得每两个街区之间都直接或间接地有街道将它们相连。Sεlιнα 把通过了文化知识竞赛的参赛男友们召集到她家所在的街区 ,并以这个街区为起点,让所有参赛男友们向其他街区跑去。这些参赛者们被命令不准重复跑某条街道,而且在规定时间内要尽可能地跑远。比赛结束后,所有参赛者将停留在他们此时所在的街区。之后 Sεlιнα 开始视察结果。现在她知道每个街区都有一些她的参赛男友停留着,她现在想先去看看离她家第 近的街区。所以作为一位好帮手,你的任务是要告诉她所有街区中,Sεlιнα 家第  近的街区Sεlιнα 家之间的距离。 

输入描述

第一行三个整数,,含义同题面描述。
接下去  行,每行三个整数,,表示从第 个街区到第 个街区有一条权值为 的街道相连。街区从 开始标号。

输出描述

输出共一行,一个整数,表示所有街区与 Sεlιнα 家所在街区之间最近距离的第  小值。 

示例1

输入:

3 3 2
1 2 4
2 3 5

输出:

9

示例2

输入:

6 4 3
1 2 7
2 3 2
2 4 2
2 5 10
3 6 3

输出:

7

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 114ms, 内存消耗: 8648K, 提交时间: 2020-10-06 20:24:35

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;

int n, p, k;
int u, v, w;
int dis[maxn];
vector<pair<int, int> > g[maxn];
void dfs(int s, int pre) {
	for(int i = 0; i < g[s].size(); i++) {
		int next = g[s][i].first;
		if(next != pre) {
			dis[next] = dis[s] + g[s][i].second;
			dfs(next, s);
		}
	}
}
int main() {
	cin >> n >> p >> k;
	for(int i = 0; i < n - 1; i++) {
		cin >> u >> v >> w;
		g[u].push_back({v, w});
		g[v].push_back({u, w});
	}
	dfs(p, 0);
	sort(dis + 1,dis + n + 1);
	cout << dis[k+1];
	system("pause");
	return 0;
}
 

C++(clang++ 11.0.1) 解法, 执行用时: 112ms, 内存消耗: 8556K, 提交时间: 2023-04-20 21:11:25

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
struct edge
{
	int v,w;
};
vector<edge>g[maxn];
int dis[maxn];
bool vis[maxn];
void dfs(int x)
{
	vis[x]=true;
	for(auto e:g[x])
	{
		if(vis[e.v]) continue;
		dis[e.v]=dis[x]+e.w;
		dfs(e.v);
	}
}
int main()
{
	int n,p,k;
	cin>>n>>p>>k;
	int u,v,w,m=n-1;
	while(m--)
	{
		cin>>u>>v>>w;
		g[u].push_back((edge){v,w});
		g[v].push_back((edge){u,w});
	}
	dfs(p);
	sort(dis+1,dis+n+1);
	cout<<dis[k+1];
	return 0;
}

Python(2.7.3) 解法, 执行用时: 1242ms, 内存消耗: 42740K, 提交时间: 2018-04-21 20:57:59

n, p, k = map(int, raw_input().split())
g = {}
d = [0] * (n + 1)


def dfs(n, father):
    for nxt, weight in g[n]:
        if nxt != father:
            d[nxt] = d[n] + weight
            dfs(nxt, n)


for _ in xrange(n - 1):
    u, v, w = map(int, raw_input().split())
    g.setdefault(u, []).append((v, w))
    g.setdefault(v, []).append((u, w))
dfs(p, -1)
print sorted(d)[k + 1]

Python3 解法, 执行用时: 594ms, 内存消耗: 41452K, 提交时间: 2022-08-17 09:36:42

n, p, k = map(int, input().split())
e=[[] for i in range(n)]
for i in range(n-1):
    u, v, w = map(int, input().split())
    e[u-1].append((v-1,w))
    e[v-1].append((u-1,w))
d=[10**10]*n
d[p - 1] = 0
def dfs(u,f):
    for (v,w) in e[u]:
        if v != f:
            d[v]=d[u] + w
            dfs(v,u)
dfs(p-1,-1)
d.sort()
print(d[k])

上一题