首页 > 其他 > 详细

UVa 11419 SAM I AM

时间:2016-08-07 18:16:50      阅读:270      评论:0      收藏:0      [点我收藏+]

很神奇的方法……参悟中

 

 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 }

 

UVa 11419 SAM I AM

原文:http://www.cnblogs.com/SilverNebula/p/5746538.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!