您的位置:首页 > 其它

UVA193图染色问题

2015-10-03 22:38 483 查看
这题是一个简单题,可是有个地方我不太明白,我的递归刚开始好像写残了,

写成这样就不对:

if(ok)
{
vis[u]=1;
dfs(u+1,sum+1);
vis[u]=0;
}
vis[u]=-1;
dfs(u+1,sum);
vis[u]=0;


当时不知道怎么想的,黑的标记成1,白的标记成-1,然后就错了,应该是对于递归理解的还不够深刻,

这样递归的话好像每次到最后一层的时候,vis数组就全部变成0了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
#include<cmath>
#include<climits>
#include<vector>
#include<cfloat>
using namespace std;
const int P = 1e9 + 7;
const int N=2000;
int n,k;
vector<int> v[110];
int G[110][110];
bool vis[110];
bool t[110];
int ans;
void dfs(int u,int sum)
{
if(u==n+1)
{
if(sum>ans)
{
ans=sum;
memcpy(t,vis,sizeof(vis));
}
return;
}
int ok=1;
for(int i=0;i<(int)v[u].size();i++)
{
int tem=v[u][i];
if(vis[tem]==1)
{
ok=0;
break;
}
}
if(ok)
{
vis[u]=1;
dfs(u+1,sum+1);
vis[u]=0;
}
dfs(u+1,sum);
}
int main()
{
int m;
cin>>m;
while(m--)
{
cin>>n>>k;
for(int i=1;i<=n;i++)
v[i].clear();
memset(G,0,sizeof(G));
ans=0;
for(int i=0;i<k;i++)
{
int a,b;
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
memset(vis,0,sizeof(vis));
dfs(1,0);
cout<<ans<<endl;
int first=1;
for(int i=1;i<=n;i++)
if(t[i]==1)
{
if(first)
{
cout<<i;
first=0;
}
else
cout<<' '<<i;
}
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: