hdu4714 Tree2cycle

来源:互联网 发布:linux查看进程被占用 编辑:程序博客网 时间:2024/05/20 11:36

下午心血来潮找来cjx第一次两人训练一套难度很低题目,就差这道思路正确不敢写,现在补一下。
题意:给你一棵树,每次删除一条边和增加一条边费用都是1,问最少的花费把一棵树变成
一条环。
思路:随手画了几个样例,发现不存在最少花费的策略,结果是唯一的。只要dfs序一遍判断每个点度数,大于2就说明需要删除这个点。思路很简单,清晰。
直接交MLE,需要扩栈,C++提交。

#pragma comment(linker,"/STACK:1024000000,1024000000")#include<cstdio>#include<cstring>#include<vector>using namespace std;const int N=1000000+10;vector<int>g[N];int degree[N],ans;void dfs(int u,int f){   for(int i=0;i<g[u].size();i++){      int v=g[u][i];      if(v==f) continue;      dfs(v,u);      if(degree[v]>2){          degree[u]--;          ans+=(degree[v]-2)*2;      }   }}int main(){    int T;scanf("%d",&T);    while(T--){        int n;scanf("%d",&n);        for(int i=1;i<=n;i++) g[i].clear();        memset(degree,0,sizeof(degree));        for(int i=0;i<n-1;i++){            int a,b;scanf("%d%d",&a,&b);            degree[a]++;degree[b]++;            g[a].push_back(b);            g[b].push_back(a);        }        ans=0;        int root;        for(int i=1;i<=n;i++){            if(degree[i]==1){                root=i;break;            }        }        dfs(root,0);        printf("%d\n",ans+1);    }}
0 0
原创粉丝点击