写不出带花树的时候还是可以考虑下骗分的
但是这是可以卡的 一般图最大匹配的随机匹配hack法
在UOJ上已经被hack烂了
具体做法 代码很清晰
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cstring>
#include<ctime>
#define cl(x) memset(x,0,sizeof(x))
#define pb push_back
using namespace std;
typedef vector<int> VI;
const int N=505;
int n,m;
VI G[N];
bool vst[N];
int match[N];
inline bool dfs(int u){
if (G[u].size()>1)
for (int t=1;t<=5;t++)
swap(G[u][rand()%G[u].size()],G[u][rand()%G[u].size()]);
vst[u]=1;
for (int i=0;i<G[u].size();i++){
int v=G[u][i];
if (vst[v]) continue;
vst[v]=1;
if (!match[v] || dfs(match[v])){
match[v]=u; match[u]=v;
return 1;
}
}
return 0;
}
int ans,Match[N];
int a[N];
inline void random_match(){
for (int i=1;i<=n;i++) a[i]=i;
for (int T=1;T<=6;T++){
random_shuffle(a+1,a+n+1);
for (int i=1;i<=n;i++) random_shuffle(G[i].begin(),G[i].end());
cl(match);
int tmp=0;
for (int i=1;i<=n;i++)
if (!match[a[i]])
for (int t=1;t<=7;t++){
cl(vst);
if (dfs(a[i])){
tmp++; break;
}
}
if (tmp>ans){
ans=tmp;
for (int i=1;i<=n;i++) Match[i]=match[i];
}
}
}
#define read(x) scanf("%d",&(x))
int main(){
int iu,iv;
srand(time(0));
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(n); read(m);
for (int i=1;i<=m;i++)
read(iu),read(iv),G[iu].pb(iv),G[iv].pb(iu);
random_match();
printf("%d\n",ans);
for (int i=1;i<=n;i++)
printf("%d ",Match[i]);
return 0;
}