标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3339 Accepted Submission(s): 1394
Special Judge
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <string> #include <map> #include <queue> #include <vector> #define inf 0x7fffffff #define met(a,b) memset(a,b,sizeof a) typedef long long ll; using namespace std; const int N = 12005; const int M = 24005; int read() {int x=0,f=1;char c=getchar();while(c<‘0‘||c>‘9‘) {if(c==‘-‘)f=-1;c=getchar();}while(c>=‘0‘&&c<=‘9‘) {x=x*10+c-‘0‘;c=getchar();}return x*f;} int n,m,cnt; int dis[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int tot,head[N]; int w[555][555],t[N],x[N],y[N]; struct man { int x,y,color,num; }; struct EDG { int to,next; }edg[M]; struct ANS { int x,y; }answ[N]; void add(int u,int v) { edg[cnt].to=v;edg[cnt].next=head[u];head[u]=cnt++; } void bfs(int u,int v) { queue<man>q; man s;s.color=0;s.num=++tot;s.x=u;s.y=v;q.push(s); w[u][v]=1;answ[tot].x=u;answ[tot].y=v; while(!q.empty()){ man t=q.front();q.pop(); for(int i=0;i<4;i++){ int xx=t.x+dis[i][0];int yy=t.y+dis[i][1]; if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!w[xx][yy]){ man k;k.color=(t.color+1)%2;k.num=++tot;k.x=xx;k.y=yy; q.push(k);w[xx][yy]=1;answ[k.num].x=xx;answ[k.num].y=yy; if(!t.color)add(t.num,k.num); else add(k.num,t.num); } } } } bool dfs(int u) { for(int i=head[u];i!=-1;i=edg[i].next) { int v=edg[i].to; if(!t[v]) { t[v]=1; if(!y[v]||dfs(y[v])) { x[u]=v; y[v]=u; return true; } } } return false; } void MaxMatch() { int ans=0; for(int i=1; i<=tot; i++) { if(!x[i]) { met(t,0); if(dfs(i))ans++; } } printf("%d\n",ans); for(int i=1;i<=tot;i++){ if(x[i]){ int v=x[i]; printf("(%d,%d)--(%d,%d)\n",answ[i].x,answ[i].y,answ[v].x,answ[v].y); } } printf("\n"); } int main() { while (~scanf("%d%d",&n,&m)&&n&&m) { met(w,0);met(head,-1);met(x,0);met(y,0);met(edg,0);met(answ,0);cnt=0;tot=0; int k=read(); while(k--){ int x=read();int y=read(); w[x][y]=1; } for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(!w[i][j])bfs(i,j); MaxMatch(); } return 0; }
HDU 1507 Uncle Tom's Inherited Land*(二分图匹配)
标签:
原文地址:http://www.cnblogs.com/jianrenfang/p/5933999.html