• 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;    
    }
  • 相关阅读:
    leetcode-9-basic-binary search
    selection problem-divide and conquer
    leetcode-8-pointer
    leetcode-7-hashTable
    前端学习之——js解析json数组
    Google浏览器如何加载本地文件
    JAVA全栈工程师应具备怎样的知识体系?
    Java全栈工程师知识体系介绍
    数据可视化工具
    使用js的FileReader对象
  • 原文地址:https://www.cnblogs.com/Lyush/p/2996492.html
Copyright © 2020-2023  润新知