1,题目:
2主要思路:
将m对仇敌关系转化成一张二维关系表(cd[i][j])通过调用表来减少dfs时的时间复杂度。
3代码:
#include <iostream>
#include<bits/stdc++.h>
#include <algorithm>
using namespace std;
int n,m;
int cd[105][105]={0},rs2[105]={0},rs3[105]={0},max1=0;
void dfs(int sum,int r){
if(r>n){
if(sum>max1){
max1=sum;
for(int i=1;i<=n;i++){
rs3[i]=rs2[i];//将选取的人录入
}
}
return ;
}
int check=1;//定义一个状态参量
for(int j=1;j<r;j++){
if(cd[r][j]==1&&rs2[j]){
check=0;//如果已被选中的人与当前需判定的人之间存在仇敌关系则check=0然后退出查找
break;
}
}
if(check){//如果没有仇敌关系
rs2[r]=1;//选上此人
dfs(sum+1,r+1);//选上此人进行下一步dfs
rs2[r]=0;//回复
}
dfs(sum,r+1); //未选此人进入下一步dfs
return ;
}
int main(){
int x,y;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x>>y;//将仇敌对输入并储存在cd表中
cd[x][y]=1;//有仇敌关系则设为1,否则为零
cd[y][x]=1;
}
dfs(0,1);
cout<<max1<<endl;
for(int i=1;i<=n;i++){
cout<<rs3[i]<<" ";
}
return 0;
}
4测试数据:
7 10
1 2
1 4
2 4
2 3
2 5
2 6
3 5
3 6
4 5
5 6
3
1 0 1 0 0 0 1