Rinne Loves Edges
题意:
有n给点,m个边,每个边有边权,给你一个点S,问最少花多少代价,可以让叶子节点无法与S点连通
题解:
dp[u]:表示u到叶子节点的最短费用的和
dp[u]+=min(dp[v],w);
代码:
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
typedef long long ll;
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=2e5+9;
vector<pair<ll,ll> >vec[maxn];
ll dp[maxn];
ll n,m,s;
ll d[maxn];
void dfs(ll u,ll fa){if(d[u]==1&&u!=s)return ;dp[u]=0;for(int i=0;i<vec[u].size();i++){ll v=vec[u][i].first;ll w=vec[u][i].second;if(v==fa)continue;dfs(v,u);dp[u]+=min(dp[v],w);}}
int main()
{cin>>n>>m>>s;for(int i=1;i<=m;i++){ll u,v,w;cin>>u>>v>>w;vec[u].push_back(make_pair(v,w));vec[v].push_back(make_pair(u,w));d[u]++;d[v]++;} memset(dp,0x3f3f3f,sizeof(dp));dfs(s,0);cout<<dp[s];return 0;
}