列表

详情


NC22598. Rinne Loves Edges

描述

Rinne  最近了解了如何快速维护可支持插入边删除边的图,并且高效的回答一下奇妙的询问。
她现在拿到了一个 n 个节点 m 条边的无向连通图,每条边有一个边权 w_i
现在她想玩一个游戏:选取一个 “重要点” S,然后选择性删除一些边,使得原图中所有除 S 之外度为 1 的点都不能到达 S。
定义删除一条边的代价为这条边的边权,现在 Rinne 想知道完成这个游戏的最小的代价,这样她就能轻松到达 rk1 了!作为回报,她会让你的排名上升一定的数量。

输入描述

第一行三个整数 N,M,S,意义如「题目描述」所述。

接下来 M 行,每行三个整数 u,v,w 代表点 u 到点 v 之间有一条长度为 w 的无向边。

输出描述

一个整数表示答案。

示例1

输入:

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

输出:

3

说明:

需要使得点 2,3,4 不能到达点 1,显然只能删除所有的边,答案为 3

示例2

输入:

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

输出:

1

说明:

需要使得点 4 不能到达点 1,显然删除边 2 \leftrightarrow 3是最优的。

原站题解

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

C++14(g++5.4) 解法, 执行用时: 154ms, 内存消耗: 11920K, 提交时间: 2019-11-28 16:31:21

#include<bits/stdc++.h>
using namespace std;

vector<int>R[100005];
vector<long long>W[100005];
long long DFS(int x,int pre)
{
	long long i,j,s=0;
	for(i=0;i<R[x].size();i++)
	{
		j=R[x][i];
		if(j==pre)continue;
		if(R[j].size()==1)s+=W[x][i];
		else s+=min(W[x][i],DFS(j,x));
	}
	return s;
}
int main()
{
	int i,j,k,N,M,S;
	scanf("%d%d%d",&N,&M,&S);
	while(M--)
	{
		scanf("%d%d%d",&i,&j,&k);
		R[i].push_back(j),W[i].push_back(k);
		R[j].push_back(i),W[j].push_back(k);
	}
	printf("%lld\n",DFS(S,0));
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 153ms, 内存消耗: 8680K, 提交时间: 2020-02-27 12:40:10

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<pair<ll,ll> >v[100010];
ll n,m,s,a,b,c,dp[100010];
void dfs(ll x,ll p)
{
	ll fg=0,w=0;
	for(auto i:v[x])
	{
		ll f=i.first,s=i.second;
		if(f==p) continue;
		dfs(f,x);
		fg=1,w+=min(dp[f],s);
	}
	if(fg) dp[x]=w;
}
int main()
{
	cin>>n>>m>>s;
	memset(dp,0x3f,sizeof dp);
	while(m--)
	{
		cin>>a>>b>>c;
		v[a].push_back({b,c}),v[b].push_back({a,c});
	}
	dfs(s,0);
	cout<<dp[s];
}

Python3 解法, 执行用时: 615ms, 内存消耗: 38112K, 提交时间: 2021-05-24 22:04:11

import math

n, m, s = map(int, input().split())
g = [[] for _ in range(n)]
for _ in range(m):
	u, v, w = map(int, input().split())
	g[u - 1].append((v - 1, w))
	g[v - 1].append((u - 1, w))

def dfs(u, p):
	res = 0
	c = 0
	for v, w in g[u]:
		if v == p: continue
		c += 1
		res += min(dfs(v, u), w)
	if c == 0: return math.inf
	return res

print(dfs(s - 1, -1))

上一题