http://acm.hdu.edu.cn/showproblem.php?pid=1507
#include<iostream>
using namespace std;
#define N 10001
struct node{
int next,v;
node(){};
node(int a,int b){
next=a;v=b;
}
}E[N*40];
int head[N],NE,pre[N];
bool h[N];
bool mark[101][101];
void init(){
NE=0;
memset(head,-1,sizeof(head));
memset(pre,-1,sizeof(pre));
}
void insert(int u,int v){
E[NE]=node(head[u],v);
head[u]=NE++;
}
bool dfs(int u){
for(int i=head[u];i!=-1;i=E[i].next){
int v=E[i].v;
if(!h[v]){
h[v]=1;
if(pre[v]==-1||dfs(pre[v])){
pre[v]=u;
return true;
}
}
}
return false;
}
int main(void){
int n,m;
while(scanf("%d%d",&n,&m),n||m){
memset(mark,0,sizeof(mark));
int k;
init();
scanf("%d",&k);
while(k--){
int x,y;
scanf("%d%d",&x,&y);
mark[x][y]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(mark[i][j])
continue;
if(i<n){
if(!mark[i+1][j]){
insert((i-1)*m+j,i*m+j);
insert(i*m+j,(i-1)*m+j);
}
}
if(j<m){
if(!mark[i][j+1]){
insert((i-1)*m+j,(i-1)*m+j+1);
insert((i-1)*m+j+1,(i-1)*m+j);
}
}
}
int cn=0;
for(int i=1;i<=n*m;i++){
memset(h,0,sizeof(h));
if(dfs(i))
cn++;
}
printf("%d\n",cn/2);
memset(h,0,sizeof(h));
for(int i=1;i<=n*m;i++)
if(pre[i]!=-1&&!h[i]&&!h[pre[i]]){
h[i]=1;
h[pre[i]]=1;
int y1=i%m;
if(y1==0) y1=m;
int x1=(i-y1)/m+1;
int y2=pre[i]%m;
if(y2==0) y2=m;
int x2=(pre[i]-y2)/m+1;
printf("(%d,%d)--(%d,%d)\n",x1,y1,x2,y2);
}
printf("\n");
}
}
建图的时候坐标对映不要搞错就ok了。。