正文

Zju 1084 Channel Allocation2006-08-29 20:12:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/17962.html

分享到:

顶点着色的贪婪算法证明是存在的,即当前的算法得到只是给出最少颜色的一个上界。

算法描述:设G是一个图,它的顶点按某一顺序记为x1,x2,......xn.

(1) 对顶点x1指定颜色1。

(2)对每个i=2,3,....n,令p是在顶点x1,x2,...xi-1与xi相邻接的顶点中没有任何一个顶点着色p的最小的颜色,并且xi指定颜色p。

数学书上的定理为:设G是一个图,对于该图顶点的最大度为△,那么贪婪算法X产生G的顶点的一个(△+1)着色,因此 X(G)<=△+1

#include <cstdio>
#include <string>

int a[26][26], n, m, ans, c[26], b[26];
char s[26];

void greedy()
{
 int i, k;
 for(i = 0; i < n; i ++)
 {
  memset(b, 0, sizeof(b));
  for(k = 0; k < n; k ++)
  {
   if(a[i][k] && c[k] != -1)
   {
    b[c[k]] = 1;
   }
  }
  for(k = 0; k <= i; k ++)
  {
   if(!b[k]) break;
  }
  c[i] = k;
 }
 for(i = 0; i < n; i ++)
 {
  if(ans < c[i])
   ans = c[i];
 }
 ans ++;
}

void init()
{
 memset(a, 0, sizeof(a));
 for(int i = 0; i < n; i ++)
 {
  c[i] = -1;
 }
 ans = 0;
}

int main()
{
 //freopen("in.txt", "r", stdin);
 while(scanf("%d", &n) && n)
 {
  int i, k;
  init();
  for(i = 0; i < n; i ++)
  {
   scanf("%s", &s);
   m = strlen(s) - 2;
   for(k = 0; k < m; k ++)
   {
    a[i][s[k + 2] - 'A'] = 1;
    a[s[k + 2] - 'A'][i] = 1;
   }
  }
  greedy();
  if(ans != 1)
   printf("%d channels needed.\n", ans);
  else
   printf("%d channel needed.\n", ans);
 }
 return 0;
}

  

阅读(4080) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册