京东 cpp研发第二题 考试安排 图论解法 POJ1419
这个题目直接删掉链接人数最多的人的策略是错的,不仅仅是字典序的问题,连数目都可能是错的,大家可以自己多试试n==3的情况 构造多种不同的边数。
下面给出网上参考的代码给出的题解。题目 源自于 POJ1419 Graph Coloring
这个题解获得的最少删除数目一定是对的,但是由于无法提交所以没办法验证是否可以通过字典序的要求。
正确解法 图论最大独立集 算法代码参照网络改进为本题要求后代码如下,思路需要百度学习。
#include<bits/stdc++.h>
using namespace std;
const int N = 505;
const int M = 100005;
bool w[N][N];
bool use[N];
bool bestx[N];
int cn,bestn,p,e;
void dfs(int x){
bool flag;
if(x>p){
bestn=cn;
for( int i=1; i<=p; i++)
bestx[i]=use[i];
return ;
}
flag=true;
for( int i=1; i<x; i++){
if(use[i]&&!w[i][x]){
flag=false;
break;
}
}
if(flag){
cn++;
use[x]=true;
dfs(x+1);
cn--;
use[x]=false;
}
if(cn+p-x>bestn){
dfs(x+1);
}
}
int main()
{
int u,v;
memset(w,true,sizeof(w));
memset(use,false,sizeof(use));
memset(bestx,false,sizeof(bestx));
scanf("%d%d",&p,&e);
p=p*2;
for(int i=0; i<e; i++)
{
scanf("%d%d",&u,&v);
w[u][v]=false;
w[v][u]=false;
}
cn=bestn=0;
dfs(1);
printf("%d\n",p-bestn);
for (int i=1; i<=p; i++)
if(!bestx[i])printf("%d ",i);
printf("\n");
return 0;
} 
