Asteroids(匈牙利算法)

求最小点覆盖数,即最大匹配数,匈牙利算法。

 1 #include<stdio.h>
 2 #include<string.h>
 3 int map[505][505],vis[505],linker[505];//linker[]记录V2中的点i在V1中所匹配的点x的编号 
 4 int n,k;
 5 int dfs(int x)
 6 {
 7     for (int i = 1; i <= n; i++)
 8     {
 9         if (map[x][i] && !vis[i])//x到i有边且i点未被标记
10         {
11             vis[i] = 1;
12             if (!linker[i]||dfs(linker[i]))//i没有匹配或被i匹配到的点可以找到增广路
13             {
14                 linker[i] = x;//更新匹配
15                 return 1;//匹配成功
16             }
17         }
18     }
19     return 0;//匹配失败
20 }
21 int main()
22 {
23     scanf("%d%d",&n,&k);
24     memset(map,0,sizeof(map));
25     memset(linker,0,sizeof(linker));
26     for (int i = 1; i <= k; i++)
27     {
28         int u,v;
29         scanf("%d%d",&u,&v);
30         map[u][v] = 1;
31     }
32     int cnt = 0;
33     for (int i = 1; i <= n; i ++)
34     {
35         memset(vis,0,sizeof(vis));//清除标记
36         if (dfs(i))
37             cnt++;
38     }
39     printf("%d\n",cnt);
40     return 0;
41 }
View Code

 

 

posted @ 2013-08-18 20:13  N_ll  阅读(171)  评论(0编辑  收藏  举报