uva193继续回溯!!

简单的回溯问题,如果是PE的话很可能是最后一个后面还输出了空格

加了一个count判断输出了几个数了,等于Max时就是最后一个节点,不要输出空格,输出换行即可。

转载请注明出处,谢谢!

http://blog.csdn.net/monkeyduck

#include<iostream>
#include<cstring>

using namespace std;

int m,n,k,Max,vis[105],result[105];
bool graph[105][105];

void dfs(int cur,int black)
{
	int i;
	if (cur==n){
		if (black>Max)
		{
			Max=black;
			memcpy(result,vis,sizeof(vis));
		}
	}
	else
	{
		vis[cur]=1;				//尝试将第cur个节点涂上黑色
		bool ok=1;
		for (i=0;i<cur;i++)
		{
			if (vis[i]&&graph[cur][i])
			{
				ok=0;
				break;
			}
		}
		if (ok) 
			dfs(cur+1,black+1);
		vis[cur]=0;
		dfs(cur+1,black);
	}
}
int main()
{
	cin>>m;
	while (m--)
	{
		cin>>n>>k;
		memset(graph,0,sizeof(graph));
		for (int i=0;i<k;i++)
		{
			int a,b;
			cin>>a>>b;
			graph[a-1][b-1]=graph[b-1][a-1]=1;
		}
		memset(vis,0,sizeof(vis));
		memset(result,0,sizeof(result));
		Max=0;
		dfs(0,0);
		cout<<Max<<endl;
		int count=1;
		for (int i=0;i<n;i++)
		{
			if (result[i]==1&&count!=Max)
			{	cout<<i+1<<" ";
				count++;
			}
			else if (result[i]==1&&count==Max)
			{
				cout<<i+1<<endl;
			}
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值