zoukankan      html  css  js  c++  java
  • UVa193Graph Coloring

    DFS

    题意:相邻的节点不能都涂成黑色,问是黑色节点最多的方案(只能选择黑和白)

    #include<iostream>
    #include<cstring>
    #include<stdio.h>
    using namespace std;
    int G[101][101],black[101],ANS[101];
    int n,m,ans;
    void DFS(int cur,int w)//cur当前要处理的节点,当前已有白色节点个数
    {
    	if(w>=n-ans)return;//白色节点多于最优情况下白色节点时
    	if(cur==n+1)
    	{
            ans=n-w;
            for(int i=1;i<=n;i++)
    		{
    			if(black[i])ANS[i]=1;
    			else ANS[i]=0;
    		}
    		return;
    	}
    	for(int j=0;j<=1;j++)
    	{
    		if(j==0)DFS(cur+1,w+1);
    		if(j==1)
    		{
    			for(int k=1;k<=n;k++)
    			{
    				if(G[cur][k]&&black[k])return;
    			}
    			black[cur]=1;
    			DFS(cur+1,w);
    			black[cur]=0;
    		}
    	}
    	return;
    }
    int main()
    {
    	int cas,x,y;
    	scanf("%d",&cas);
    	while(cas--)
    	{
    		memset(black,0,sizeof(black));
    		memset(ANS,0,sizeof(ANS));
    		memset(G,0,sizeof(G));
    		scanf("%d%d",&n,&m);
            for(int i=0;i<m;i++)
    		{
                 scanf("%d%d",&x,&y);
    			 G[x][y]=1;
    			 G[y][x]=1;
    		}
    		ans=0;
    		DFS(1,0);
            int f=0;
    		printf("%d\n",ans);
    		for(int i=1;i<=n;i++)
    		{
    			
    			if(ANS[i]&&f)printf(" %d",i);
    			else if(ANS[i]){printf("%d",i);f=1;}
    		}
    		printf("\n");
    		
    	}
    }
    
  • 相关阅读:
    69. 二叉树的层次遍历
    17. 子集(Subsets)
    33. N皇后问题(回溯)
    15. 全排列
    53. 数字组合 II
    135. 数字组合
    95. 验证二叉查找树
    88. 最近公共祖先
    245. 子树
    [python应用]python简单图片抓取
  • 原文地址:https://www.cnblogs.com/sook/p/2003726.html
Copyright © 2011-2022 走看看