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 }
本文为博主原创文章,转载请注明出处。