您的位置:首页 > 其它

【POJ 1419】Graph Coloring

2015-07-28 10:41 232 查看
【POJ 1419】Graph Coloring

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

很适合理解最大团/最大独立集的模板题

建立补图套模板既可 需要输出集合点 原本想用stack 但发现copy比较麻烦 vector用一个iterator指针 循环很便利

代码如下:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

bool mp[111][111];
int link[111][111],dp[111],mx;
vector <int> s,ss;

void dfs(int n,int num,int step)
{
    int i,j,k,cnt;
    if(num == 0)
    {
        if(mx < step)
        {
            s.clear();
            vector<int>::iterator it = ss.begin();
            for(;it != ss.end(); ++it)
                s.push_back(*it);
            mx = step;
        }
        return;
    }
    for(i = 0; i < num; ++i)
    {
        cnt = 0;
        k = link[step][i];
        if(step + n - k <= mx) return;
        if(step + dp[k] <= mx) return;
        for(j = i+1; j < num; ++j) if(mp[link[step][j]][k]) link[step+1][cnt++] = link[step][j];
        ss.push_back(k);
        dfs(n,cnt,step+1);
        ss.pop_back();
    }
}

int GetMax(int n)
{
    int i,j,sz;
    mx = 0;
    for(i = n; i >= 1; --i)
    {
        sz = 0;
        for(j = i+1; j <= n; ++j) if(mp[i][j]) link[1][sz++] = j;
        ss.push_back(i);
        dfs(n,sz,1);
        ss.pop_back();
        dp[i] = mx;
    }
    return mx;
}

int main()
{
    int t,n,m,u,v,i;
    scanf("%d",&t);
    while(t--)
    {
        memset(mp,true,sizeof(mp));
        scanf("%d %d",&n,&m);
        while(m--)
        {
            scanf("%d %d",&u,&v);
            mp[u][v] = mp[v][u] = false;
        }
        for(i = 1; i <= n; ++i) mp[i][i] = false;
        printf("%d\n",GetMax(n));
        vector <int> ::iterator it = s.begin();
        for(; it+1 != s.end(); ++it)
            printf("%d ",*it);
        printf("%d\n",*it);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: