您的位置:首页 > 其它

[Trick] 一般图最大匹配的随机匹配

2017-04-10 22:08 260 查看
写不出带花树的时候还是可以考虑下骗分的

但是这是可以卡的 一般图最大匹配的随机匹配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
;
bool vst
;
int match
;

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
;
int a
;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: