匈牙利算法 poj 2466 Chessboard
2014-09-14 11:59
288 查看
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<queue> #define inf 999999999 using namespace std; struct node { int x; int y; }; char str[220][220]; int map[220][220]; int link[1220]; int used[1220]; int n, m; node s,next; int mx[4]={ 0,0,1,-1 }; int my[4]={ -1,1,0,0 }; int ok( int x,int y ) { if( x<0||x>=n||y<0||y>=m ) return 0; return 1; } int find( int x ) { int i; for( i=0;i<4;i++ ) { int xx=x/m+mx[i]; int yy=x%m+my[i]; if( ok( xx,yy )&&map[xx][yy]!=-1&&used[xx*m+yy]==0 ) { used[xx*m+yy]=1; if( link[xx*m+yy]==-1||find( link[xx*m+yy] ) ) { link[xx*m+yy]=x; return 1; } } } return 0; } int main() { int i, j, k, t, min; int x, y; while( scanf( "%d%d%d",&n,&m ,&k )!=-1 ) { int sum=0; t=0; for( i=0;i<n;i++ ) { for( j=0;j<m;j++ ) map[i][j]=t++; } for( i=0;i<k;i++ ) { scanf( "%d%d",&x, &y ); map[y-1][x-1]=-1; } memset( link,-1,sizeof( link ) ); for( i=0;i<n;i++ ) { for( j=0;j<m;j++ ) { if( map[i][j]!=-1&&( i+j )&1 ) { memset( used,0,sizeof( used ) ); if( find( map[i][j] ) ) sum++; } } } if( (n*m-k)==sum*2 ) printf( "YES\n" ); else printf( "NO\n" ); } return 0; }
<pre name="code" class="cpp"><pre name="code" class="cpp">#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<ctype.h>int map[110][110];int used[110][110];int num[20];int cap[20];int xx[4]={1,0,0,-1};int yy[4]={0,-1,1,0};struct node{int x;int y;}link[110][110];int find( int x,int y,int n,int m ){int i,j;for( i=0;i<4;i++ ){int xxx=x+xx[i];int yyy=y+yy[i];if( xxx>=1&&xxx<=n&&yyy>=1&&yyy<=m&&!map[xxx][yyy]&&used[xxx][yyy]==0){used[xxx][yyy]=1;if( link[xxx][yyy].x==0||find( link[xxx][yyy].x,link[xxx][yyy].y,n,m ) ){link[xxx][yyy].x=x;link[xxx][yyy].y=y;return 1;}}}return 0;}int main(){int i, j, k, n, m, t, cas, count, sum;int x,y,z;while( scanf( "%d%d%d",&n,&m,&k )!=-1 ){count=0;memset( map,0,sizeof( map ) );memset( link,0,sizeof( link ) );for( i=0;i<k;i++ ){scanf( "%d%d",&x,&y );map[y][x]=1;}for( i=1;i<=n;i++ ){for( j=1;j<=m;j++ ){if( map[i][j]==0&&( i+j )&1 ){memset( used,0,sizeof( used ) );if( find( i,j,n,m ) )count++;}}}if( n*m-k==( count*2 ) )printf( "YES\n" );elseprintf( "NO\n" );}return 0;}
相关文章推荐
- Poj 2446 Chessboard 匈牙利算法
- poj_2446 Chessboard匈牙利算法
- POJ 2446 Chessboard (匈牙利算法)
- POJ 2446 Chessboard(匈牙利算法)
- 【二分图最大匹配】【匈牙利算法】poj1469 COURSES && poj2446 Chessboard
- POJ 2446 Chessboard(匈牙利算法)
- Poj 2446 Chessboard 匈牙利算法
- POJ 1274 The Perfect Stall (匈牙利算法)
- poj 3020 匈牙利算法
- poj 3020(匈牙利算法的简单应用,关键是构图)
- POJ 2584 最大匹配。匈牙利算法
- Poj1469_匈牙利算法_最大二分匹配
- POJ 3020 Antenna Placement 匈牙利算法
- POJ 3041 Asteroids 二分图匹配 匈牙利算法
- poj 3041 匈牙利算法 最小点覆盖
- poj 3715 Blue and Red(二分图最大匹配匈牙利算法)
- poj 3041 二分匹配 基础题(整理版:基础知识)匈牙利算法
- 匈牙利算法之POJ1087
- poj 3041 匈牙利算法
- POJ 3041 Asteroids 二分图匹配 匈牙利算法