(F - 超级英雄Hero HYSBZ - 1191 )匈牙利算法

题目链接:https://cn.vjudge.net/contest/281037#problem/F

题目大意:中文题目

具体思路:可以看成二分图匹配,寻找最大匹配就可以了,注意当某一个匹配不到的时候,就应该直接break,因为进不到下面的关卡了,一开始的时候没有想到是二分图最大匹配,想了一会就去搞A题了,结果A题,,。

AC代码:

 1 #include<iostream>
 2 #include<stack>
 3 #include<iomanip>
 4 #include<cmath>
 5 #include<stdio.h>
 6 #include<cstring>
 7 #include<algorithm>
 8 #include<queue>
 9 #include<vector>
10 using namespace std;
11 # define ll long long
12 const int maxn =1e3+100;
13 int a[maxn+10][maxn+10];
14 int n,m;
15 int vis[maxn+10],net[maxn+10];
16 int Find(int t)
17 {
18     for(int i=0; i<=maxn; i++)
19     {
20         if(vis[i]==1||a[t][i]==0)
21             continue;
22         vis[i]=1;
23         if(net[i]==-1||Find(net[i]))
24         {
25             net[i]=t;
26             return true;
27         }
28     }
29     return false;
30 }
31 int match()
32 {
33     int ans=0;
34     memset(net,-1,sizeof(net));
35     for(int i=1; i<=n; i++)
36     {
37         memset(vis,0,sizeof(vis));
38         if(Find(i))
39             ans++;
40             else break;//找不到就直接break
41     }
42     return ans;
43 }
44 int main()
45 {
46     int t1,t2;
47     scanf("%d %d",&n,&m);
48     for(int i=1; i<=m; i++)
49     {
50         scanf("%d %d",&t1,&t2);
51         a[i][t2]=1;
52        a[i][t1]=1;
53     }
54     int ans=match();
55     printf("%d\n",ans);
56     return 0;
57 }

 

posted @ 2019-01-25 16:50  Let_Life_Stop  阅读(208)  评论(0编辑  收藏  举报