(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 }