南阳239----月老的难题『匈牙利算法』

 1 /*
 2 匈牙利算法模版题
 3 邻接表实现,邻接矩阵超时
 4 最大匹配问题
 5  */
 6 #include <cstdio>
 7 #include <vector>
 8 #include <cstring>
 9 using namespace std;
10 const int maxn = 505;
11 vector<int> v[maxn];//x = v[i][j]表示i可以与x进行匹配
12 int vis[maxn],match[maxn];//vis[i]表示i已经访问(匹配)过为了防止在每次dfs中重复访问某点,x = match[i]表示x现在和i匹配
13 bool dfs(int x)
14 {
15     for(int i = 0; i < v[x].size(); ++i)
16     {
17         int t = v[x][i];
18         if(!vis[t])
19         {
20             vis[t] = 1;
21             if(match[t] == -1 || dfs(match[t]))
22             {match[t] = x; return true;}
23         }
24     }
25     return false;
26 }
27 int hungary(int n)
28 {
29     int ans = 0;
30     for(int i = 1; i <= n; ++i)
31     {
32         memset(vis,0,sizeof vis);
33         if(dfs(i)) ++ans;
34     }
35     return ans;
36 }
37 int main()
38 {
39     int t,n,m,x,y;
40     scanf("%d",&t);
41     while(t--)
42     {
43         scanf("%d%d",&n,&m);
44         for(int i = 1; i <= n; ++i)
45             v[i].clear();
46         memset(match, -1, sizeof match);
47         while(m--)
48         {
49             scanf("%d%d",&x,&y);
50             v[x].push_back(y);
51         }
52         printf("%d\n",hungary(n));
53     }
54     return 0;
55 }

 

posted @ 2017-08-14 10:46  Posase  阅读(154)  评论(0编辑  收藏  举报