如果从第一点开始染色,则第一点可以染m种色。我们如果以第一点为根节点,用dfs来构建一个有向图的话,入度为0的点能够染m种色,而且因为是用dfs建图的,所以入度不为0的话只能为1,这时只能染m-1种色。所以只需要单纯的根据入度来计算就可以了。以为数值非常大,所以需要大数乘法,这里我在网上随便找个模板过了。。。
/******************************************************************************* # Author : Neo Fung # Email : [email protected] # Last modified: 2012-04-08 20:51 # Filename: ZOJ1486 Color the Tree.cpp # Description : ******************************************************************************/ #ifdef _MSC_VER #define DEBUG #define _CRT_SECURE_NO_DEPRECATE #endif #include <fstream> #include <stdio.h> #include <iostream> #include <string.h> #include <string> #include <limits.h> #include <algorithm> #include <math.h> #include <numeric> #include <functional> #include <ctype.h> #include <vector> #define MAX 60 #define MAX_DIGIT 200 using namespace std; vector<int> vec_array[MAX]; // int visit[MAX],ans; int n,m; int multiply(int* a,int ca,int* b,int cb,int* c) { int i,j,* s; s=(int*)malloc(sizeof(int)*(ca+cb)); for (i=0;i<ca+cb;i++) s[i]=0; for (i=0;i<ca;i++) for (j=0;j<cb;j++) s[i+j+1]+=(a[i])*(b[j]);//i+j+1的目的就是为了防止最高位进位而产生错误 for (i=ca+cb-1;i>=0;i--) if (s[i]>=10) { s[i-1]+=s[i]/10; s[i]%=10; } i=0; while (s[i]==0) i++;//去除前导0 for (j=0;i<ca+cb;i++,j++) c[j]=s[i]; free(s); return j; } bool in_degree[MAX],visit[MAX]; void dfs(const int &x) { visit[x]=true; for(int i=0;i<vec_array[x].size();++i) if(!visit[vec_array[x][i]]) { in_degree[vec_array[x][i]]=true; dfs(vec_array[x][i]); } } int main(void) { #ifdef DEBUG freopen("../stdin.txt","r",stdin); freopen("../stdout.txt","w",stdout); #endif int u,v; while(~scanf("%d%d",&n,&m) && n+m) { for(int i=1;i<=n;++i) vec_array[i].clear(); for(int i=1;i<n;++i) { scanf("%d%d",&u,&v); vec_array[u].push_back(v); vec_array[v].push_back(u); } memset(visit,false,sizeof(visit)); memset(in_degree,false,sizeof(in_degree)); for(int i=1;i<=n;++i) if(!visit[i]) dfs(i); int a[MAX_DIGIT],b[MAX_DIGIT],c[MAX_DIGIT]; int ca=0,cb=0,cc=0; int tmp=m; if(in_degree[1]) --tmp; if(tmp>9) { a[0]=tmp/10; a[1]=tmp%10; ca=2; } else { a[0]=tmp; ca=1; } memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); for(int i=2;i<=n;++i) { tmp=m; if(in_degree[i]) --tmp; if(tmp>9) { b[0]=tmp/10; b[1]=tmp%10; cb=2; } else { b[0]=tmp; cb=1; } cc=multiply(a,ca,b,cb,c); memcpy(a,c,sizeof(a)); ca=cc; } if(ca==0) printf("0"); else for(int i=0;i<ca;++i) printf("%d",a[i]); printf("\n"); } return 0; }