ZOJ1486 Color the Tree

來源:互聯網
上載者:User

如果從第一點開始染色,則第一點可以染m種色。我們如果以第一點為根節點,用dfs來構建一個有向圖的話,入度為0的點能夠染m種色,而且因為是用dfs建圖的,所以入度不為0的話只能為1,這時只能染m-1種色。所以只需要單純的根據入度來計算就可以了。以為數值非常大,所以需要大數乘法,這裡我在網上隨便找個模板過了。。。


/******************************************************************************* # Author : Neo Fung # Email : neosfung@gmail.com # 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 200using 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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.