poj1419 Graph Coloring(dp)

poj1419

题意

给你一张图,相邻两个点不能都图成黑色(但可以都是白的,或一黑一白),问最多能涂多少个黑色的点


题解

这题啊,应该是求最大独立子集
然后我们要知道,最大独立子集=补图的最大团
那么,我们这道题就要求原图的补图,然后再求最大团咯
再说说最大团怎么写呢
最大团很好玩,我学了一晚上!(没学会【捂脸】
那么怎么求呢!

这是个np问题呢!

所以,就dp吧【捂脸】
而且这题…数据emmmm(请自行想象~)
所以..它它它根本不用求补图..就直接dp就可以了【捂脸】

啊犯了这么多神经..啊没事反正没人看~
———————————2018年3月16日23点43分 纪念此犯神经的时刻


代码

#include <cstdio>
#include <cstring>
#define N 110
int T,n,m,cnt,mx,mp[N][N],col[N],ans[N];
void dfs(int x){
    if(x==n+1){
        if(cnt>mx){
            mx=cnt;
            memcpy(ans,col,sizeof(col));
        }return ;
    }
    int flag=1;
    for(int i=1;i<=n;i++) if(i!=x && mp[x][i] && col[i]){flag=0;break;}
    if(flag){
        cnt++;col[x]=1;
        dfs(x+1);
        cnt--;col[x]=0;
    }dfs(x+1);
}
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        memset(mp,0,sizeof(mp));
        memset(col,0,sizeof(col));
        for(int i=1;i<=m;i++){
            int x,y;scanf("%d%d",&x,&y);
            mp[x][y]=mp[y][x]=1;
        }cnt=0;mx=0;dfs(1);
        printf("%d\n",mx);
        for(int i=1;i<=n;i++) if(ans[i]) printf("%d ",i);printf("\n");
    } 
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值