zoukankan      html  css  js  c++  java
  • 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;    
    }
  • 相关阅读:
    ajax()方法与后台交互
    实现CSS中的垂直水平居中(附带Flex布局,CSS3+SASS完美版)
    yield语句
    匿名方法和Lambda表达式
    委托、Lambda表达式和事件
    分治法
    分治法求一个N个元素数组的逆序数
    快速找出故障机器
    C++关联容器综合应用:TextQuery小程序
    转:做一个有趣的有意思的人
  • 原文地址:https://www.cnblogs.com/Lyush/p/2996492.html
Copyright © 2011-2022 走看看