uoj79 一般图最大匹配(带花树)
2018-01-27 18:07
239 查看
写着感觉好麻烦呀。。。心力交瘁。。。大概就是缩花,花套花想想就迷。。。推荐几个学习的好地方:
http://www.csie.ntnu.edu.tw/~u91029/Matching.html
2015 年中国国家队候选队员论文集,陈胤伯,《浅谈图的匹配算法及其应用》
http://www.csie.ntnu.edu.tw/~u91029/Matching.html
2015 年中国国家队候选队员论文集,陈胤伯,《浅谈图的匹配算法及其应用》
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; #define N 510 #define M 124760 #define ll long long #define inf 0x3f3f3f3f inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int n,m,h ,num=0,mate ,pre ,fa ,ans=0,col ,tim=0,vis ; //col=0,偶点 col=1,奇点 col=-1,未访问 int q ,qh=0,qt=0; struct edge{ int to,next; }data[M<<1]; inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} inline int lca(int x,int y){ x=find(x),y=find(y);++tim; for(;;swap(x,y)) if(x){ if(vis[x]==tim) return x; vis[x]=tim; if(mate[x]) x=find(pre[mate[x]]); else x=0; } } inline void blossom(int x,int y,int t){ while(find(x)!=t){ pre[x]=y; y=mate[x]; if(col[y]==1) col[y]=0,q[++qt]=y;//通过正着走或反着走全都可以变偶点 fa[x]=fa[y]=t;x=pre[y];//并在一朵花上 } } inline bool match(int s){ for(int i=1;i<=n;++i) fa[i]=i;memset(pre,0,sizeof(pre)); memset(col,-1,sizeof(col));qh=1;qt=0; q[++qt]=s;col[s]=0; while(qh<=qt){ int x=q[qh++]; for(int i=h[x];i;i=data[i].next){ int y=data[i].to; if(col[y]==-1){ col[y]=1;pre[y]=x; if(!mate[y]){ for(int last;x;y=last,x=pre[y])//x-even y-odd,增广路取反 last=mate[x],mate[x]=y,mate[y]=x;return 1; }else q[++qt]=mate[y],col[mate[y]]=0; }else if(!col[y]&&find(x)!=find(y)){//奇环,缩花 int t=lca(x,y); blossom(x,y,t);blossom(y,x,t); } } }return 0; } int main(){ // freopen("a.in","r",stdin); n=read();m=read(); while(m--){ int x=read(),y=read(); data[++num].to=y;data[num].next=h[x];h[x]=num; data[++num].to=x;data[num].next=h[y];h[y]=num; }for(int i=1;i<=n;++i) if(!mate[i]&&match(i)) ans++; printf("%d\n",ans); for(int i=1;i<n;++i) printf("%d ",mate[i]);printf("%d\n",mate ); return 0; }
相关文章推荐
- uoj79 一般图最大匹配&【带花树】初学
- 一般图最大匹配 带花树算法 模板
- Ural 1099 Work Scheduling (一般图的最大匹配:带花树算法)
- 一般图最大匹配--带花树算法
- 带花树(一般图最大匹配)
- zoj3316【一般图最大匹配 带花树开花】
- 【BZOJ4405】挑战NPC 带花树模板 一般图最大匹配
- 一般图最大匹配--带花树算法
- UOJ-79 一般图的最大匹配(带花树模板求解)
- 【转】带花树(一般无向图的最大匹配)
- ZOJ 3316 Game 一般图最大匹配带花树
- 一般图最大匹配问题-带花树开花算法
- uoj#79. 一般图最大匹配【带花树模板】
- 一般图最大匹配——带花树算法
- HDU 3551 Hard Problem 一般图的最大匹配(带花树)
- 带花树算法--一般图最大匹配
- URAL 1099 Work scheduling 一般图的最大匹配 带花树算法(模板)
- Work Scheduling URAL - 1099 一般图的最大匹配(带花树)
- #79. 一般图最大匹配(带花树算法)
- URAL1099-Work Scheduling(一般图最大匹配(带花树))