UVA - 193 Graph Coloring

题目大意:涂色,相邻(有连接)的点不能都上色,求最多能涂多色个点,输出个数和编号。

解题思路:dfs 从一号点开始判断,与当前点连接的点是否有涂色,如果都没有,就给当前点涂色(回溯当前点不涂色),直到判断完所有的点,统计一下上色的点的个数,存下较多的情况。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
bool link[200][200];
bool node[200];
int m, n, k;
int ans, tmp;
int as[200];
void dfs(int now) {
    if (now > n) {
        tmp = 0;
        for (int i = 1; i <= n; i++)
            if (node[i]) tmp++;
        if (tmp > ans) {
            ans = tmp;
            int tag = 1;
            for (int i = 1; i <= n; i++)
                if (node[i]) as[tag++] = i;
        }
        return;
    }
    int tag = 1;
    for (int i = 1; i <= n; i++)
        if (link[now][i] && node[i])
            tag = 0;
    if (tag) {
        node[now] = 1;
        dfs(now+1);
    }
    node[now] = 0;
    dfs(now+1);

}
int main() {
    scanf("%d", &m);
    while (m--) {
        memset(link, 0, sizeof(link));
        scanf("%d%d", &n, &k);
        for (int i = 0; i < k; i++) {
            int a, b;
            scanf("%d%d", &a, &b);
            link[a][b] = 1;
            link[b][a] = 1;
        }

        ans = 0;
        dfs(1);

        printf("%d\n", ans);
        for (int i = 1; i < ans; i++)
            printf("%d ", as[i]);
        printf("%d\n", as[ans]);
    }
return 0; 
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yanduoxuan/article/details/52357139
文章标签: uva dfs
个人分类: UVA 回溯
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭