POJ 3041 Asteroids

匈牙利二部匹配的裸题,算法思想我是懂了,但是代码为什么可以那样写我还没想明白。鉴于过几天要比赛了,所以先拿别人的模板来用。

 1 #include<stdio.h>
 2 #include<iostream>
 3 using namespace std;
 4 
 5 #include<math.h>
 6 #include<algorithm>
 7 #include<string.h>
 8 #include<stdlib.h>
 9 #include<vector>
10 #include<set>
11 #include<map>
12 #include<string>
13 #include<queue>
14 
15 #define repA(p,q,i)  for( int (i)=(p); (i)!=(q); ++(i) )
16 #define repAE(p,q,i)  for( int (i)=(p); (i)<=(q); ++(i) )
17 #define repD(p,q,i)  for( int (i)=(p); (i)!=(q); --(i) )
18 #define repDE(p,q,i)  for( int (i)=(p); (i)>=(q); --(i) )
19 #define range 510
20 
21 bool G[range][range];
22 bool visit[range];
23 int match[range];
24 int n,k;
25 
26 bool dfs(int s);
27 
28 int main()
29 {
30     while( scanf("%d%d",&n,&k) != EOF )
31     {
32            int a,b;
33            memset(G,false,sizeof(G) );
34            while(k--)
35            {
36                    scanf("%d%d",&a,&b);
37                    G[a][b]=true;  
38            }
39            
40            repAE(1,n,i)  match[i]=-1;
41            int used=0;
42            repAE(1,n,i)
43            {
44                    memset(visit,false,sizeof(visit) );
45                    if(dfs(i) )
46                      ++used;
47            }
48            
49            printf("%d\n",used);
50     }
51     return 0;
52 }
53 
54 bool dfs(int s)
55 {
56     repAE(1,n,i)
57     {
58          if(G[s][i] && !visit[i])
59          {
60               visit[i]=true;
61               if(match[i] == -1 || dfs( match[i] ) )
62               {
63                     match[i]=s;
64                     return true;
65               }
66          }
67     }
68     return false;
69 }
View Code

 

posted on 2013-10-22 20:28  码农之上~  阅读(168)  评论(0编辑  收藏  举报

导航