栾宫涅吧 关注:6贴子:216
  • 2回复贴,共1

HDU1530 Maximum Clique

只看楼主收藏回复

#include <iostream>
#include <stdio.h>
using namespace std;    
#define MAXN 60
void clique(int n, int* u, int mat[][MAXN], int size, int& max, int& bb, int* res, int* rr, int* c) {
     int i, j, vn, v[MAXN];
     if (n) {
         if (size + c[u[0]] <= max) return;
         for (i = 0; i < n + size - max && i < n; ++ i) {
             for (j = i + 1, vn = 0; j < n; ++ j)
                 if (mat[u[i]][u[j]])
                     v[vn ++] = u[j];
             rr[size] = u[i];
             clique(vn, v, mat, size + 1, max, bb, res, rr, c);
             if (bb) return;
         }
     } else if (size > max) {
         max = size;
         for (i = 0; i < size; ++ i)
             res[i] = rr[i];
         bb = 1;
     }
}
int maxclique(int n, int mat[][MAXN], int *ret) {
     int max = 0, bb, c[MAXN], i, j;
     int vn, v[MAXN], rr[MAXN];
     for (c[i = n - 1] = 0; i >= 0; -- i) {
         for (vn = 0, j = i + 1; j < n; ++ j)
             if (mat[i][j])
                 v[vn ++] = j;
         bb = 0;
         rr[0] = i;
         clique(vn, v, mat, 1, max, bb, ret, rr, c);
         c[i] = max;
     }
     return max;
}
int main()
{
     int n,i,j,ret[MAXN],mat[MAXN][MAXN];
     while (scanf("%d",&n)&&n)
     {
         for (i=0;i<n;i++)
             for (j=0;j<n;j++) scanf("%d",&mat[i][j]);
         printf("%d\n",maxclique(n,mat,ret));
     }
     return 0;
}


1楼2011-05-31 18:30回复
    最大团问题,模板AC


    2楼2011-05-31 18:32
    回复
      2026-04-04 12:49:57
      广告
      不感兴趣
      开通SVIP免广告


      来自手机贴吧3楼2012-09-22 18:40
      回复