图染色

来源:互联网 发布:国家开放大学网络教育 编辑:程序博客网 时间:2024/04/20 21:38
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int N=20+10;char ss[N][N];typedef unsigned LL;int mp[N][N];int top,sta[N],clo[N];int num,vis[N][N],ti,s1;int dfs(int dep){    if(dep==top){        num--;        return 1;    }    int fg=++ti;    int u=sta[dep];    for(int i=0;i<dep;i++){        int v=sta[i];        if(mp[u][v]){            //printf("%d %d\n",u,v);            vis[dep][clo[i]]=fg;        }    }    for(int i=1;i<num;i++){        if(vis[dep][i]!=fg){            clo[dep]=i;            if(dfs(dep+1))return 1;        }    }    return 0;}int dp[1<<20];int main(){    #ifdef DouBi    freopen("in.cpp","r",stdin);    #endif // DouBi    int T;scanf("%d",&T);    while(T--){        int n;scanf("%d",&n);        for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&mp[i][j]);        int ed=1<<n;        memset(vis,0,sizeof(vis));        ti=0;        dp[0]=0;        for(int i=1;i<ed;i++){            top=0;            num=0;            for(int j=0;j<n;j++){                int bt=1<<j;                if(i&bt){                    sta[top++]=j;                    num=max(num,dp[i^bt]);                }            }            num++;            int fg=1;            for(int j=0;j<top&&fg;j++){                for(int k=0;k<j;k++){                    if(mp[sta[j]][sta[k]]==0){                        fg=0;break;                    }                }            }            if(!fg)dfs(0);            dp[i]=num;        }    }    return 0;}

0 0
原创粉丝点击