不会带花树
学一发随机匹配骗点分
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int N=510;
int n,m,ans,a[N],vis[N],Mc[N],iMc[N];
vector<int> e[N];
bool dfs(int x){
if(e[x].size()>1)
for(int i=1;i<=5;i++) swap(e[x][rand()%e[x].size()],e[x][rand()%e[x].size()]);
vis[x]=1;
for(int i=0;i<e[x].size();i++){
int u=e[x][i];
if(vis[u]) continue;
vis[u]=1;
if(!iMc[u] || dfs(iMc[u])){
iMc[u]=x; iMc[x]=u; return 1;
}
}
return 0;
}
inline void RandMatch(){
for(int i=1;i<=n;i++) a[i]=i;
random_shuffle(a+1,a+1+n);
for(int i=1;i<=n;i++) random_shuffle(e[i].begin(),e[i].end());
memset(iMc,0,sizeof(iMc));
int cur=0;
for(int i=1;i<=n;i++)
if(!iMc[a[i]]){
for(int j=1;j<=6;j++){
memset(vis,0,sizeof(vis));
if(dfs(a[i])){
cur++; break;
}
}
}
if(cur>ans) ans=cur,memcpy(Mc,iMc,sizeof(Mc));
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1,x,y;i<=m;i++)
scanf("%d%d",&x,&y),e[x].push_back(y),e[y].push_back(x);
for(int i=0;i<6;i++) RandMatch();
printf("%d\n",ans);
for(int i=1;i<=n;i++) printf("%d ",Mc[i]);
return 0;
}

本文介绍了一个简单的随机匹配算法实现,该算法通过随机交换边来尝试找到一个较大的匹配,适用于解决某些图论问题。代码中使用了C++进行实现,并通过多次随机匹配尝试找到最佳解。
1026

被折叠的 条评论
为什么被折叠?



