题目链接:http://acm.fzu.edu.cn/problem.php?pid=2141
题意:
给定n个点 m条无向边的无向图
求一个 至少包含m条边的同构子图 且是二分图
输出二分图的 X点集 和 Y点集
思路:
非正解
我们可以先随机出一组解,再判断这组解是否可行(估测可行解空间较大)
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define N 105
bool s[N];
int n, m;
int Stack[N], top, nowlen;
struct node{
int u,v;
}edge[10096];
int edgenum;
void put(bool hehe){
top = 0;
for(int i=1;i<=n;i++)if(s[i] == hehe)Stack[top++] = i;
printf("%d",top);
if(top)sort(Stack, Stack+top);
while(top--)printf(" %d",Stack[top]); printf("\n");
}
int main(){
int T, i;scanf("%d",&T);
while(T--){
edgenum = nowlen = 0;
scanf("%d %d",&n,&m);
for(i = 0; i < m; i++)
{
scanf("%d %d",&edge[edgenum].u,&edge[edgenum].v);
edgenum++;
}
while(nowlen<m/2)
{
nowlen = 0;
for(i=1;i<=n;i++) s[i] = (rand())&1;
for(i=0;i<edgenum;i++) nowlen+=s[ edge[i].u ] ^ s[edge[i].v ];
}
put(true);
put(false);
}
return 0;
}