HDU1530 Maximum Clique 最大团裸题

题意:给定一个邻接矩阵,求最大团。

解法:直接AC。

代码如下:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;

int N, mp[55][55];
int ret, st[55], cnt[55];

void dfs(int x, int num) {
    int flag;
    for (int i = x+1; i < N; ++i) {
        if (!mp[x][i]) continue;
        if (cnt[i]+num <= ret) return;
        flag = true;
        for (int j = 0; j < num; ++j) {
            if (!mp[i][st[j]]) {
                flag = false;
                break;
            }
        }
        if (flag) {
            st[num] = i;
            dfs(i, num+1);    
        }
    }
    if (num > ret) {
        ret = num;    
    }
}

int query() {
    ret = 0;
    for (int i = N-1; i >= 0; --i) {
        st[0] = i;
        dfs(i, 1);
        cnt[i] = ret;
    }
    return ret;
}

int main() {
    while (scanf("%d", &N), N) {
        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < N; ++j) {
                scanf("%d", &mp[i][j]);
            }
        }
        printf("%d\n", query());
    }
    return 0;    
}

老版本:8000MS+,前面的1000MS+

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;

int N, mp[55][55];
int ret, st[55], cnt;

void dfs(int x) {
    if (x >= N) {
        ret = cnt;
        return;
    }
    int flag = true;
    for (int i = 0; i < N; ++i) {
        if (st[i] && !mp[x][i]) {
            flag = false;
            break;
        }
    }
    if (flag) {
        st[x] = 1, ++cnt;
        dfs(x+1);
        st[x] = 0, --cnt;    
    }
    if (cnt+N-1-x > ret) {
        dfs(x+1);
    }
}

int query() {
    ret = cnt = 0;
    memset(st, 0, sizeof (st));
    dfs(0);
    return ret;
}

int main() {
    while (scanf("%d", &N), N) {
        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < N; ++j) {
                scanf("%d", &mp[i][j]);
            }
        }
        printf("%d\n", query());
    }
    return 0;    
}
原文地址:https://www.cnblogs.com/Lyush/p/2996492.html