[Trick] 一般图最大匹配的随机匹配
2017-04-10 22:08
260 查看
写不出带花树的时候还是可以考虑下骗分的
但是这是可以卡的 一般图最大匹配的随机匹配hack法
在UOJ上已经被hack烂了
具体做法 代码很清晰
但是这是可以卡的 一般图最大匹配的随机匹配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; }
相关文章推荐
- [随机] UOJ#79. 一般图最大(随机)匹配
- [模板]带花树算法(一般图最大匹配)
- 利用带花树算法解决一般图的最大匹配
- 带花树算法--一般图最大匹配
- 一般图最大匹配--带花树算法
- 【一般图最大匹配】URAL - 1099 Work Scheduling
- 一般图的最大匹配问题(真心觉得难)
- 一般图最大匹配--带花树算法
- 一般图最大匹配问题-带花树开花算法
- HDU 3551 Hard Problem 一般图的最大匹配(带花树)
- UOJ79 一般图最大匹配
- HDOJ 4687 Boke and Tsukkomi 一般图最大匹配带花树+暴力
- [UOJ171][WC2016]挑战NPC-一般图最大匹配
- uoj#79. 一般图最大匹配【带花树模板】
- 一般图最大匹配的匈牙利算法
- ural 1099. Work Scheduling 一般图最大匹配
- 【总结】一般图最大匹配
- 一般图最大匹配——带花树算法
- 一般图最大匹配--带花树
- uoj79 一般图最大匹配&【带花树】初学