hdu1151 Air Raid 二分匹配

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1151

求最小路径覆盖

二分图最小路径覆盖=点的个数-最大匹配。

代码:

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 #define maxn  125
 7 int g[maxn][maxn];
 8 int vis[maxn];
 9 int cx[maxn];
10 int cy[maxn];
11 int n;
12 int m;
13 int ans;
14 int path(int u)
15 {
16 
17   vis[u]=1;
18   for(int v=1;v<=n;v++)
19   {
20      if(vis[v]==0 && g[u][v]!=0)
21      {
22         vis[v]=1;
23 
24         if(cy[v]==-1 || path(cy[v]))
25         {
26             cx[u]=v;
27             cy[v]=u;
28             return 1;
29         }
30      }
31   }
32   return 0;
33 }
34 void MaxMatch()
35 {
36    memset(cx,-1,sizeof(cx));
37    memset(cy,-1,sizeof(cy));
38 
39    for(int i=1;i<=n;i++)
40    {
41       if(cx[i]==-1)
42       {
43          
44         memset(vis,0,sizeof(vis));
45         ans+=path(i);
46       }
47    }
48 }
49 int main()
50 {
51    int t;
52   scanf("%d",&t);
53    while(t--)
54    {
55        ans=0;
56        scanf("%d",&n);
57        scanf("%d",&m);
58        memset(g,0,sizeof(g));  
59        int s,e;
60       for(int i=0;i<m;i++)
61       {
62        scanf("%d%d", &s,&e);
63        g[s][e]=1;
64       }
65          MaxMatch();
66          cout<<n-ans<<endl;
67 
68       
69    }
70    return 0;
71 }

 

posted on 2013-11-01 18:08  GyyZyp  阅读(136)  评论(0编辑  收藏  举报

导航