思路:
注意题中的M M=N-1 并且图联通 说明这是一棵树
然后题意就是说 让重要点s 到不了其他度为1的点
度为1的点 那不就是叶子节点嘛
所以我们只要从点s开始dfs,计算出到叶子节点的路上的最短的边权加起来即可
复杂度O(n)
用dp[x]表示节点x到每个叶子节点的最小边权值
那么dp[x]+=min(dp[u],v) 其中x是当前节点,u是x的子节点,v表示u-x的边权
想好之后 就可以快乐ac了
注意对根节点赋值一个无穷大的数 还有记得开ll
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct node { int to; ll v; }; ll dp[100005]; vector<node> e[100005]; bool vis[100005]; int n,m,s; void dfs(int x){ int f=0; for(int i=0;i<e[x].size();i++){ if(!vis[e[x][i].to]){ f=1; vis[e[x][i].to]=1; dfs(e[x][i].to); dp[x]+=min(e[x][i].v,dp[e[x][i].to]); } } if(!f) dp[x]=1e18; } int main(){ ios::sync_with_stdio(0); cin>>n>>m>>s; for(int i=1,x,y;i<n;i++){ ll d;cin>>x>>y>>d; e[x].push_back({y,d}); e[y].push_back({x,d}); } vis[s]=1; dfs(s); cout<<dp[s]<<endl; return 0; }