poj 2446 Chessboard 二分图最大匹配经典题
2012-08-16 22:08
330 查看
/*题意是在一些有洞的棋盘上用一个1x2的方形条将棋盘完全填满。可以对不是洞的每一个点找和他相邻的点,如果他相邻的点也不是洞的话,就画一条边。然后获取标号。实际上就是一个将一个点拆分成两个点的想法。将||可能||,可能匹配的点都连一条!!*/ #include <iostream> #include <stdio.h> #include <vector> #include <cstring> using namespace std; int map[40][40]; bool vis[1050]; int match[1050]; int n,m,k; int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int getnum(int x,int y) { return (x-1)*m+y; } vector<int> v[1050]; bool find(int x) { for(int i=0;i<v[x].size();i++) { int u=v[x][i]; if(!vis[u]) { vis[u]=true; if(find(match[u])||match[u]==-1) { match[u]=x; return true; } } } return false; } int main() { int a,b; while(scanf("%d%d%d",&n,&m,&k)==3) { for(int i=0; i<1000; i++) v[i].clear(); memset(match,-1,sizeof(match)); memset(map,0,sizeof(map)); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) map[i][j]=1; for(int i=1; i<=k; i++) { scanf("%d%d",&a,&b); map[b][a]=0;//坑爹致死啊! } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(!map[i][j]) continue; for(int k=0;k<4;k++) { int x=i+d[k][0]; int y=j+d[k][1]; if(map[x][y]) { int num1=getnum(i,j); int num2=getnum(x,y); v[num1].push_back(num2); } } } int ans=0; for(int i=1;i<=n*m;i++) { memset(vis,false,sizeof(vis)); if(find(i)) ans++; } int mm=n*m-k; if(ans==mm) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- POJ - 2446 Chessboard 二分图 最大匹配(输入坑)
- POJ 2446 Chessboard 二分图的最大匹配 <建图>
- [POJ] 2446 Chessboard(二分图最大匹配)
- POJ 2446 Chessboard(二分图最大匹配)
- poj 2446 Chessboard 二分图的最大匹配
- POJ 2446 Chessboard(二分图最大匹配)
- POJ 2446Chessboard(二分图最大匹配)
- POJ 2446-Chessboard(二分图_最大匹配)
- POJ2446 Chessboard【二分图最大匹配】
- poj--2446 Chessboard(二分图最大匹配)
- POJ 2446 Chessboard (二分图最大匹配)
- poj 2446 Chessboard(二分图最大匹配)
- POJ 2446 Chessboard(二分图最大匹配)
- 【二分图+最大匹配】北大 poj 2446 Chessboard
- POJ 2446 Chessboard(二分图最大匹配)
- poj 2446 Chessboard (二分图利用奇偶性匹配)
- POJ 2446 Chessboard(奇偶建点法+最大匹配)
- POJ 3189--Steady Cow Assignment【二分图多重匹配 && 最大流求解 && 枚举 && 经典】
- poj 2446 二分图 最大匹配
- Poj 2446 Chessboard 【二分匹配+经典建图模型】