fzu 2195 检查站点

来源:互联网 发布:编程电脑配置 编辑:程序博客网 时间:2024/06/05 11:51

http://acm.fzu.edu.cn/problem.php?pid=2195




给出一棵生成树,1为根节点,N个点,N-1条边,从父节点到儿子节点是不花费的,但是反向则是有花费的,问从1开始走,把所有点都遍历一次需要的最少花费,思路就是,既然最终肯定是停在一个叶子节点的,那么必定是有一条路到这个叶子节点是不花费的,那么为了花费最少,用全部的路花费和减去最远的路的长度即可。




#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>#include <queue>#include <vector>using namespace std;int n;vector<int> po[111111];vector<int> co[111111];int su[111111];int find(int x){      if(po[x].size()==0)      {      return su[x]=0;  }  else if(po[x].size()==1)  {  return su[x]=find(po[x][0])+co[x][0];  }  else {  for(int i=0;i<po[x].size();i++)  {  if(po[po[x][i]].size()==0)  {  su[x]=max(su[x],co[x][i]);  }  else {  su[x]=max(su[x],co[x][i]+find(po[x][i]));  }}return su[x];  }}int main(){while(scanf("%d",&n)!=EOF){    int x,y;int z;    for(int i=1;i<=100221;i++)    {    po[i].clear();    co[i].clear();}    memset(su,0,sizeof(su));int sum=0;    for(int i=1;i<=n-1;i++)    {    scanf("%d%d%d",&x,&y,&z);    sum+=z;    co[x].push_back(z);    po[x].push_back(y);}int lss=find(1);int lm=sum-lss;cout<<lm<<endl;}return 0;}