题意:裸裸裸
思路:我来讲一下匈牙利算法的思路把,就是对于一个点A来说,首先尝试他的匹配点B,如果这个B的匹配点已经被匹配到了点C,那么就让B的匹配点C去找找看,能不能找到另外一个匹配D,如果C和D匹配上了,那么B就空着了,那么就可以和A匹配上了,这样我们一直找一直找就能找到他的最大匹配
上代码:
#include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace std; const int maxn = 1000+10; int Map[maxn][maxn],math[maxn],used[maxn]; int n,m,a,b; int dfs(int u) // 当前第u个点 { for(int i = 1 ; i <= n ; i++) { if(Map[u][i] && !used[i]) // 如果u—>i 有路且第i个点没有用过 { used[i] = 1; if(math[i] == 0 || dfs(math[i])) //如果他还没有匹配或者他找到了匹配 { math[i] = u; return 1; } } } return 0; } int main() { cin>>n>>m; for(int i = 0 ; i < m ; i++) { cin>>a>>b; Map[a][b] = 1; Map[b][a] = 1; } int ans = 0 ; memset(used,0,sizeof(used)); memset(math,0,sizeof(math)); for(int i = 1 ; i <= n ; i++) { memset(used,0,sizeof(used)); if(dfs(i)) { // printf("I = %d \n",i); ans++; } } cout<<ans/2<<endl; }