Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
贴一份代码,树形dp,O(n)#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <queue> #include <algorithm> #include <map> #include <cmath> #include <iomanip> #define INF 99999 typedef long long LL; using namespace std; const int MAX=100+10; int n,size; //以u为根的树: //temp[0]表示点v为根的树仅属于一个环的最少添加边数 //temp[1]表示点v为根的树除v外仅属于一个环的最少添加边数 //temp[2]表示点v为根的树除v和一条从v出发的链外仅属于一个环的最少添加边数 //由于每个v只会使用一次,所以采用每次temp[3]=dp[3]临时赋值(滚动数组的思想)节省空间,不需要dp[v][3] int head[MAX],temp[3]; struct Edge{ int v,next; Edge(){} Edge(int V,int NEXT):v(V),next(NEXT){} }edge[MAX*2]; void Init(int num){ for(int i=0;i<=num;++i)head[i]=-1; size=0; } void InsertEdge(int u,int v){ edge[size]=Edge(v,head[u]); head[u]=size++; } void dfs(int u,int father){ //a用来记录哪个点使得dp[u][1]-dp[v][0]+dp[v][2]+1最小,a是记录dp[v][2]-dp[v][0]即temp[2]-temp[0] //b,c用来记录哪两个点使得dp[u][1]-dp[b][0]+min(dp[b][1],dp[b][2])-dp[c][0]+min(dp[c][1],dp[c][2])+1最小 //b,c记录min(dp[v][1],dp[v][2])-dp[v][0]即min(temp[1],temp[2])-temp[0] int dp[3]={0,0,INF},a=INF,b=INF,c=INF,v,w; for(int i=head[u];i != -1;i=edge[i].next){ v=edge[i].v; if(v == father)continue; dfs(v,u); dp[1]+=temp[0]; if(temp[2]-temp[0]<a)a=temp[2]-temp[0]; w=min(temp[1],temp[2])-temp[0]; if(w<b){c=b;b=w;} else if(w<c)c=w; } temp[1]=dp[1];//temp[1]=dp[1]; temp[2]=dp[1]+b;//temp[2]=dp[2]=dp[1]+min(dp[v][1],dp[v][2])-dp[v][0]=dp[2]+b temp[0]=dp[1]+min(a,b+c)+1;//temp[0]=dp[0]=dp[1]+min(a,b,c) } int main(){ int u,v; while(~scanf("%d",&n)){ Init(n); for(int i=1;i<n;++i){ scanf("%d%d",&u,&v); InsertEdge(u,v); InsertEdge(v,u); } dfs(1,-1); if(temp[0]>=INF)printf("-1\n");//cout<<-1<<endl; else printf("%d\n",temp[0]);//cout<<temp[0]<<endl; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator