hdu 4619 Warm up 2_最大独立集
2013-07-25 21:47
369 查看
三个人整个下午都想不出这题
后来看题解,竟然用匈牙利算法的最大独立集,我顿时晕了。
题意:给竖着和横着的方块,除去重叠的,最多能留下几个方块
后来看题解,竟然用匈牙利算法的最大独立集,我顿时晕了。
题意:给竖着和横着的方块,除去重叠的,最多能留下几个方块
#include <cstdlib> #include <iostream> using namespace std; #define N 1010 struct Point{ int x,y; Point(){} Point(int a,int b){x=a;y=b;} bool operator==(const Point &a)const{ return x==a.x&&y==a.y; } }pn ,pm ; int link ,n,m; bool vis ,g ; bool judge(Point a,Point b){ if(a==b||Point(a.x+1,a.y)==b||Point(b.x,b.y+1)==a||Point(a.x+1,a.y)==Point(b.x,b.y+1)) return 1; return 0; } bool dfs(int u){ int i; for(i=0;i<m;i++){ if(!vis[i]&&g[u][i]){ vis[i]=1; if(link[i]==-1||dfs(link[i])){ link[i]=u; return 1; } } } return 0; } int main(int argc, char *argv[]) { int i,j; while(scanf("%d%d",&n,&m)&&m||n){ memset(g,0,sizeof(g)); for(i=0;i<n;i++) scanf("%d%d",&pn[i].x,&pn[i].y); for(i=0;i<m;i++) scanf("%d%d",&pm[i].x,&pm[i].y); for(i=0;i<n;i++) for(j=0;j<m;j++) if(judge(pn[i],pm[j])) g[i][j]=1; memset(link,-1,sizeof(link)); int sum=0; for(i=0;i<n;i++){ memset(vis,0,sizeof(vis)); sum+=dfs(i); } printf("%d\n",n+m-sum); } //system("PAUSE"); return EXIT_SUCCESS; }
相关文章推荐
- HDU 4619 Warm up 2 最大独立集
- HDU 4619 Warm up 2(贪心、并查集 | 二分图最大独立集)
- HDU 4619 Warm up 2(最大独立集)
- hdu 4619 Warm up 2 (二分图最大独立集)
- hdu 4619 Warm up 2_最大独立集
- HDU 4619 Warm up 2 最大独立集
- HDU 4619 Warm up 2(最大流或二分匹配)
- hdu 4619 Warm up 2 ( 二分图最大匹配 )
- HDU 4619 Warm up 2(点独立集)
- HDU 4619 (二分图匹配 最大独立集)
- HDU-4619:Warm up 2(二分图最大独立集)
- hdu 4619 Warm up 2(最大独立点集,二分匹配,4级)
- hdu 4619 Warm up 2(二分图最大匹配)
- hdu 4619 Warm up 2 ( 二分图最大匹配 )
- HDU 4619 —— Warm up 2(二分图最大匹配)
- hdu 4619—二分图求最大独立集
- HDU 1565 方格取数(1)(最大点权独立集)
- hdu 1068(最大独立集)
- hdu - 4619 - Warm up 2
- hdu 4619 Warm up 2(并查集)