二分图的最少边匹配,即找出最少的边可以覆盖所有的点。用匈牙利算法找出最大匹配,则最终结果为:ans = 图的顶点数 - 最大匹配。
代码如下:
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 #include<cstdio> 5 #include<cstring> 6 7 #define MAXN 125 8 9 int match[MAXN]; 10 int map[MAXN][MAXN]; 11 int vis[MAXN]; 12 int n,m; 13 14 int find(int x) 15 { 16 for(int i=1;i<=n;i++) 17 { 18 if(map[x][i]&&!vis[i]) 19 { 20 vis[i] = 1; 21 if(!match[i] || find(match[i])) 22 { 23 match[i] = x; 24 return 1; 25 } 26 } 27 } 28 return 0; 29 } 30 31 int main() 32 { 33 int T; 34 scanf("%d",&T); 35 while(T--) 36 { 37 memset(map,0,sizeof(map)); 38 memset(match,0,sizeof(match)); 39 int a,b; 40 scanf("%d%d",&n,&m); 41 for(int i=0;i<m;i++) 42 { 43 scanf("%d%d",&a,&b); 44 map[a][b]=1; 45 } 46 47 int ans=0; 48 for(int i=1;i<=n;i++) 49 { 50 memset(vis,0,sizeof(vis)); 51 ans+=find(i); 52 } 53 printf("%d\n",n-ans); 54 } 55 return 0; 56 }