UVA - 193 Graph Coloring

来源:互联网 发布:淘宝买家如何快速升钻 编辑:程序博客网 时间:2024/05/21 10:19

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

解题思路: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; }
0 0
原创粉丝点击