解法:黑白染色法!!
#include<cstdio> #include<algorithm> #include<memory.h> using namespace std; const int maxn=10002; int f[maxn][6],mat[maxn],vis[maxn],n,m; int map[102][102]; int dx[5]= {1,-1,0,0}; int dy[6]= {0,0,-1,1}; int list[maxn]; ///邻接表 实现匈牙利算法 int idx,num,link; int inmap(int x,int y) { if(x>=1&&x<=n&&y>=1&&y<=m)return 1; return 0; } int find(int x) { for(int i=f[x][0]; i>=1; i--) { int y=f[x][i]; if(!vis[y]) { vis[y]=1; if(mat[y]==-1||find(mat[y])) { mat[y]=x; return 1; } } } return 0; } int main() { int i,j,k,t,ans,xi,yi; while(scanf("%d%d",&n,&m),(n||m)) { memset(f,0,sizeof(f)); memset(mat,-1,sizeof(mat)); memset(map,1,sizeof(map)); int cnt=0; ans=0; scanf("%d",&k); for(i=1; i<=k; i++) { scanf("%d %d",&xi,&yi); map[xi][yi]=0; } for(i=1; i<=n; i++) { for(j=1; j<=m; j++) { if(map[i][j]&&(i+j)%2==0) { int flag=0; for(t=0; t<4; t++) { int x=i+dx[t]; int y=j+dy[t]; if(inmap(x,y)&&map[x][y]) { flag=1; f[(i-1)*m+j][++f[(i-1)*m+j][0]]=(x-1)*m+y; } } if(flag)list[cnt++]=(i-1)*m+j; } } } for(i=0; i<cnt; i++) { int x=(list[i]+m-1)/m; int y=list[i]-x; memset(vis,0,sizeof(vis)); if(find(list[i])) ans++; } printf("%d\n",ans); for(i=2; i<=m*n; i++) { int x=(i+m-1)/m; int y=i-(x-1)*m; if(mat[i]>0) { // cout<<mat[i]<<endl; // system("pause"); int x1=(mat[i]+m-1)/m; int y1=mat[i]-(x1-1)*m; printf("(%d,%d)--(%d,%d)\n",x1,y1,x,y); } } printf("\n"); } return 0; }