poj1419 Graph Coloring 最大独立集(最大团)

最大独立集: 顶点集V中取 K个顶点,其两两间无连接。

最大团: 顶点集V中取 K个顶点,其两两间有边连接。

最大独立集=补图的最大团
最大团=补图的最大独立集

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

int mp[110][110],mark1[505],mark2[505];
int n,m;
int cnt,maxx;

void dfs(int x)
{
    if(x>n)   // 如果枚举了所有的节点
    {
        maxx=cnt;
        memcpy(mark1,mark2,sizeof(mark2)); // 用一个更大的极大团替代原有的极大团
        return;
    }
    int flag=true;
    for(int i=1; i<x; i++)   // 检测新加入的点是否到团中的其他节点都存在一条边
    {
        if(mark2[i] && !mp[i][x])
        {
            flag=false;
            break;
        }
    }
    if(flag)   // 如果该节点满足在这个团中
    {
        mark2[x]=1,cnt++; // 该节点被加入到完全子图中去
        dfs(x+1);
        mark2[x]=0,cnt--;
    }
    if (cnt+n-x>maxx)   // 跳过x节点进行搜索同时进行一个可行性判定
        dfs(x+1);
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        memset(mark1,0,sizeof(mark2));
        memset(mark2,0,sizeof(mark2));
        maxx=cnt=0;
        for(int i=0; i<105; i++)
            fill(mp[i],mp[i]+105,1);
        for(int i=1; i<=m; i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            mp[a][b]= mp[b][a]=0;
        }
        dfs(1);
        printf("%d\n",maxx);
        int k=0;
        for(int i=1; i<=n; i++)
        {
            if(mark1[i])
            {
                if(k==0)
                {
                    printf("%d",i);
                    k=1;
                }
                else
                    printf(" %d",i);
            }
        }
        puts("");
    }
    return 0;
}
时间: 2024-08-08 10:05:39

poj1419 Graph Coloring 最大独立集(最大团)的相关文章

POJ1419 Graph Coloring(最大独立集)(最大团)

Graph Coloring Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4926   Accepted: 2289   Special Judge Description You are to write a program that tries to find an optimal coloring for a given graph. Colors are applied to the nodes of the

poj1419 Graph Coloring,无向图,最大独立集

最大独立集 = 补图的最大团 最小顶点覆盖 + 最大独立集 = V #include <stdio.h> #include <string.h> const int maxn =100 + 10; int g[maxn][maxn], dp[maxn], n; int x[maxn], ans[maxn], mx; int dfs(int *adj, int ns, int dep) { int t[maxn]; if(0 == ns) { if(dep > mx) { fo

Graph Coloring(最大独立集模板题)

Graph Coloring POJ - 1419 You are to write a program that tries to find an optimal coloring for a given graph. Colors are applied to the nodes of the graph and the only available colors are black and white. The coloring of the graph is called optimal

【POJ 1419】Graph Coloring

[POJ 1419]Graph Coloring 求图的最大独立集 最大独立集=补图最大团 很适合理解最大团/最大独立集的模板题 建立补图套模板既可 需要输出集合点 原本想用stack 但发现copy比较麻烦 vector用一个iterator指针 循环很便利 代码如下: #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <vecto

poj 1419 Graph Coloring_最大独立集

题目链接 题意:给出你一个无向图,然后对其中的点去上色, 只能上黑色和白色,要求是黑色点不能相邻,问最多能上多少黑色的顶点. 思路:点独立集:设无向图G=<V,E>,顶点集合V'是V的子集,若V'中的任意两个顶点都不相邻,则称V'为G的点独立集 这题求的是最大独立集 还有一个定理是最大独立集=补图的最大团 最大团=补图的最大独立集 #include<stdio.h> #include<string.h> #define MAXN 100 int n,map[MAXN][

GPS-Graph Processing System Graph Coloring算法分析 (三)

Graph coloring is the problem of assigning a color to each vertex of an undirected graph such that no two adjacent vertices have the same color. We implement the greedy algorithm from Scalable parallel graph coloring algorithms. The algorithm iterati

uva193 - Graph Coloring

Graph Coloring You are to write a program that tries to find an optimal coloring for a given graph. Colors are applied to the nodes of the graph and the only available colors are black and white. The coloring of the graph is called optimal if a maxim

poj 1419 Graph Coloring

http://poj.org/problem?id=1419 题意: 一张图黑白染色,相邻点不能都染黑色,最多能染几个黑色点 最大点独立集 但是图不能同构为二分图,不能用二分图匹配来做 那就爆搜吧 还可以转化为补图的最大团问题 #include<cstdio> #include<cstring> #include<iostream> using namespace std; bool map[101][101]; int color[101],res[101]; int

193 - Graph Coloring(DFS)

题目:193 - Graph Coloring 题目大意:给出一个图,图里面有点和边,要求相邻的点不可以都是黑色的,问怎样上色黑色的点最多的,给出字典序最大的那种组合情况. 解题思路:dfs每个点是黑是白,将黑的点保存记录下来,然后下次再试探某个点是黑点的时候,就看看这个点和之前的那些点有没有相邻,相邻就表示这个点不是黑点.每个试探的点只需要是这个点之后的点就可以了,因为前面的点已经试探过了. 代码: #include <stdio.h> #include <string.h> c