天天看點

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;
}