CODEVS1022 覆盖 (二分图染色+匈牙利算法)
2014-12-23 20:39
267 查看
先对整幅图进行二分图染色,再跑一遍匈牙利算法。
/* CODEVS1022 */ #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define maxn 10008 struct edge{ int u,v,next; }eg[maxn*4]; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int a[108][108]; int cl[maxn]; int n,m,k,sum,ans; int last[maxn],l[maxn]; bool pd[maxn]; void dfs(int i,int j,int w) { int x,y,k; cl[a[i][j]]=w; for (k=0;k<4;k++) { int x,y; x=i+dx[k]; y=j+dy[k]; if ((a[x][y]!=-1)&&!cl[a[x][y]]) dfs(x,y,3-w); } } void add(int u,int v) { eg[++sum].u=u; eg[sum].v=v; eg[sum].next=last[u]; last[u]=sum; } bool find(int u) { for (int i=last[u];i;i=eg[i].next) { int v=eg[i].v; if (!pd[v]) { pd[v]=1; if ((!l[v])||find(l[v])) { l[v]=u; return 1; } } } return 0; } int main() { int i,j,k; sum=0; memset(a,-1,sizeof(a)); scanf("%d%d%d",&m,&n,&k); for (i=1;i<=m;i++) for (j=1;j<=n;j++) a[i][j]=(i-1)*n+j; for (int i=1;i<=k;i++) { int x,y; scanf("%d",&x); if (x==0) break; scanf("%d",&y); a[x][y]=-1; } for (i=1;i<=m;i++) for (j=1;j<=n;j++) if ((a[i][j]!=-1)&&!cl[a[i][j]]) dfs(i,j,1); for (i=1;i<=m;i++) for (j=1;j<=n;j++) if (cl[a[i][j]]) for (k=0;k<4;k++) { int x,y; x=i+dx[k]; y=j+dy[k]; if ((a[x][y]!=-1)&&cl[a[x][y]]) add(a[i][j],a[x][y]); } ans=0; memset(l,0,sizeof(l)); for (i=1;i<=m*n;i++) if (cl[i]==1) { memset(pd,0,sizeof(pd)); if (find(i)) ans++; } //for (i=1;i<=m*n;i++) printf("%d ",l[i]); printf("%d",ans); return 0; }
相关文章推荐
- 【codevs 1022】覆盖(匈牙利算法)
- code vs 1022 覆盖 (匈牙利算法)
- 【基础练习】【二分图匹配】【匈牙利算法】codevs1022 覆盖题解
- [codevs1022]覆盖(染色+二分图最大匹配)
- codevs 1922 骑士共存问题||二分图||最大独立集||二分图匹配||Dinic与匈牙利算法的讨论||网络流
- [网络流24题][CODEVS1904]最小路径覆盖问题(最大流||匈牙利算法)
- codevs1022覆盖(二分图最大匹配)
- codevs1022 覆盖[Hungary 二分图最大匹配]
- 二分图最大覆盖问题的匈牙利算法
- hdu2119(二分图+最小点覆盖+匈牙利算法)
- POJ-1325-Machine Schedule-最小点覆盖(二分图-匈牙利算法)
- poj3041 最小点覆盖==二分图最大匹配 匈牙利算法求解最大匹配问题(运用DFS)
- Codevs 1222 信与信封问题 二分图匹配,匈牙利算法
- POJ-1947-Asteroids-求最小点覆盖数(二分图-匈牙利算法)
- 彻底搞定二分图的匈牙利算法,最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖
- hdu1054(二分图+最小点覆盖数+匈牙利算法)
- 二分图系列•二分图判定•匈牙利算法二分图的最大匹配•二分图最小点覆盖及最大独立集
- HDU 1150 Machine Schedule(匈牙利算法 二分图的最小顶点覆盖 二分图最大匹配)
- HDU 2063 过山车(匈牙利算法 二分图的最小顶点覆盖 二分图最大匹配)
- POJ 1325 Machine Schedule (二分图最小点集覆盖 匈牙利算法)