zoukankan      html  css  js  c++  java
  • poj 1419 Graph Coloring

    这道题要求的就是一个图的最大独立集,而我们知道一个图的最大独立集等于这个图的补图的最大团。使用BK算法求解即可。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    const int N=109;
    int ans,n,m,a[N][N],cnt[N],vis[N],Ans[N];
    
    int dfs(int x,int now)
    {
    	for (int i=x+1;i<=n;i++)
    	{
    		if(cnt[i]+now<=ans) return 0;
    		if(!a[x][i]) continue;
    		int j;
    		for (j=1;j<now;j++) 
    			if(!a[i][vis[j]]) break;
    		if(j==now)
    		{
    			vis[now]=i;
    			if(dfs(i,now+1)) return 1;
    		}
    	}
    	if(now>ans+1)
    	{
    		ans=now-1;
    		for (int i=1;i<=ans;i++)
    			Ans[i]=vis[i];
    		return 1;
    	}
    	return 0;
    }
    
    void init()
    {
    	scanf("%d %d",&n,&m);
    	memset(a,0,sizeof(a));
    	for (int i=1,x,y;i<=m;i++)
    		scanf("%d %d",&x,&y),a[x][y]=a[y][x]=1;
    	for (int i=1;i<=n;i++)
    		for (int j=1;j<=n;j++)
    			a[i][j]^=1;
    }
    
    void work()
    {
    	int T;
    	scanf("%d",&T);
    	while(T--)
    	{
    		init();
    		ans=-1;
    		for (int i=n;i>=1;i--)
    		{
    			vis[1]=i;
    			dfs(i,2);
    			cnt[i]=ans;
    		}
    		printf("%d
    ",ans);
    		for (int i=1;i<=ans;i++)
    			printf("%d ",Ans[i]);puts("");
    	}
    }
    
    int main()
    {
    	work();
    	return 0;
    }
    
    由于博主比较菜,所以有很多东西待学习,大部分文章会持续更新,另外如果有出错或者不周之处,欢迎大家在评论中指出!
  • 相关阅读:
    贪婪大陆
    色板游戏
    11/29 NOIP 模拟赛
    USACO4.4 重叠的图像 Frame Up
    CSP2020 题解
    NOIP前板子复习
    关于我
    【洛谷】【搜索+字符串】
    【洛谷】【动态规划/01背包】P2925 [USACO08DEC]干草出售Hay For Sale
    【洛谷】【二分查找】P1102 A−B数对
  • 原文地址:https://www.cnblogs.com/With-penguin/p/13039943.html
Copyright © 2011-2022 走看看