POJ 1422

 1 #include <iostream>
 2 #define MAXN 350
 3 using namespace std;
 4 
 5 int mat[MAXN][MAXN];
 6 bool mark[MAXN];
 7 int match[MAXN];
 8 int graph_match(int n,int mat[][MAXN],int * match);
 9 int main()
10 {
11     //freopen("acm.acm","r",stdin);
12     int test;
13     int n;
14     int m;
15     int u;
16     int v;
17     int i;
18     int j;
19     cin>>test;
20     while(test --)
21     {
22         memset(mat,0,sizeof(mat));
23         memset(match,-1,sizeof(match));
24         cin>>n;
25         cin>>m;
26         for(i = 0; i < m; ++ i)
27         {
28             cin>>u;
29             cin>>v;
30             -- u;
31             -- v;
32             mat[u][v+n] = 1;
33         }
34 
35         cout<<n-graph_match(n*2,mat,match)<<endl;
36     }
37 
38 }
39 
40 
41 //一般图最大匹配,邻接阵形式,复杂度O(n^3)
42 //返回匹配顶点对数,match返回匹配,未匹配顶点match值为-1
43 //传入图的顶点数n和邻接阵mat
44 //graph_match()为最终调用函数
45 
46 int aug(int n,int mat[][MAXN],int* match,int* v,int now){
47     int i,ret=0;
48     v[now]=1;
49     for (i=0;i<n;i++)
50         if (!v[i]&&mat[now][i]){
51             if (match[i]<0)
52                 match[now]=i,match[i]=now,ret=1;
53             else{
54                 v[i]=1;
55                 if (aug(n,mat,match,v,match[i]))
56                     match[now]=i,match[i]=now,ret=1;
57                 v[i]=0;
58             }
59             if (ret)
60                 break;
61         }
62     v[now]=0;
63     return ret;
64 }
65 int graph_match(int n,int mat[][MAXN],int * match){
66     int v[MAXN],i,j;
67     for (i=0;i<n;i++)
68     v[i]=0,match[i]=-1;
69     for (i=0,j=n;i<n&&j>=2;)
70         if (match[i]<0&&aug(n,mat,match,v,i))
71             i=0,j-=2;
72         else
73             i++;
74     for (i=j=0;i<n;i++)
75         j+=(match[i]>=0);
76     return j/2;
77 }

关注我的公众号,当然,如果你对Java, Scala, Python等技术经验,以及编程日记,感兴趣的话。 

技术网站地址: vmfor.com

原文地址:https://www.cnblogs.com/gavinsp/p/4563387.html