UVa 11419 SAM I AM

很神奇的方法……参悟中

 

 1 /**/
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 using namespace std;
 9 const int mxn=12000;
10 vector<int>e[mxn];
11 int link[mxn],vis[mxn];
12 bool mk[mxn];
13 int n,r,c;
14 void init(){
15     for(int i=1;i<mxn;i++)e[i].clear();
16     memset(link,0,sizeof link);
17 }
18 bool dfs(int x){
19     int i,j;
20     mk[x]=1;
21     for(i=0;i<e[x].size();i++){
22         int v=e[x][i];
23         if(!vis[v]){
24             vis[v]=1;
25             mk[v]=1;
26             if(!link[v] || dfs(link[v])){
27                 link[v]=x;
28                 link[x]=v;
29                 return 1;
30             }
31         }
32     }
33     return 0;
34 }
35 void path(){
36     int i,j;
37     memset(mk,0,sizeof mk);
38     for(i=1;i<=r;i++){
39         if(!link[i]){
40             memset(vis,0,sizeof vis);
41             dfs(i);
42         }
43     }
44     for(i=1;i<=r;i++){
45         if(!mk[i]){
46             printf(" r%d",i);
47         }
48     }
49     for(i=1;i<=c;i++){
50         if(mk[i+r]){
51             printf(" c%d",i);
52         }
53     }
54     printf("\n");
55     return;
56 }
57 int main(){
58     while(scanf("%d%d%d",&r,&c,&n) && r && c && n){
59         init();
60         int i,j;
61         int x,y;
62         for(i=1;i<=n;i++){
63             scanf("%d%d",&x,&y);
64             e[x].push_back(y+r);
65             e[y+r].push_back(x);
66         }
67         int ans=0;
68         for(i=1;i<=r;i++){//第一次匹配,算答案 
69             memset(vis,0,sizeof vis);
70             if(dfs(i))ans++;
71         }
72         printf("%d ",ans);
73         path();//算路径 
74     }
75     return 0;
76 }

 

posted @ 2016-08-07 16:44  SilverNebula  阅读(188)  评论(0编辑  收藏  举报
AmazingCounters.com