题目:
一棵有根树,每条边上具有割掉该边的代价,求割开这个树的最小代价(所谓割开一棵有根树,就是删除若干条边,使得任何任何叶子节点和根节点不连通)
DFS入门题,自下而上累计答案求min
//Luogu3931 #include<bits/stdc++.h> #define MAXN 100007 #define INF 0x7f7f7f7f using namespace std; int read(){ int x=0,t=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')t=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*t; } int N,root,cnt,last[MAXN],f[MAXN],p[MAXN]; struct Edge{ int other,pre,val; }a[MAXN*2]; void connect(int x,int y,int z){ a[++cnt]=(Edge){y,last[x],z}; last[x]=cnt; } void DFS(int x) { for(int i=last[x];i;i=a[i].pre){ int to=a[i].other; if(p[x]!=to){ p[to]=x; DFS(to); f[x]+=min(f[to],a[i].val); //割边 还是 继承 取 min } } if(!f[x])f[x]=INF; //叶子设正无穷 } int main() { N=read(),root=read(); for(int i=1;i<=N-1;i++){ int x=read(),y=read(),z=read(); connect(x,y,z);connect(y,x,z); } DFS(root); printf("%d\n",f[root]); return 0; }