这个相当于把两两的关系搞成图
求的是所有边的子集,使得这个子集没有两两无公共点
这个代码不好理解
#include<bits/stdc++.h>
using namespace std;
#define MAX_V 100
int V;
vector<int> G[MAX_V];
int match[MAX_V];
bool used[MAX_V];
void add_edge(int u,int v){
G[u].push_back(v);
G[v].push_back(u);
}
bool dfs(int v){
used[v]=true;
for(int i=0;i<G[v].size();i++){
int u=G[v][i],w=match[u];
if(w<0||!used[w]&&dfs(w)){
match[v]=u;
match[u]=v;
return true;
}
}
return false;
}
int bipartite_matching(){
int res=0;
memset(match,-1,sizeof(match));
for(int v=0;v<V;v++){
if(match[v]<0){
memset(used,0,sizeof(used));
if(dfs(v)){
res++;
}
}
}
printf("%d\n",res);
return res;
}
int main()
{
int m;
scanf("%d%d",&V,&m);
while(m--){
int a,b;
scanf("%d%d",&a,&b);
add_edge(a-1,b-1);
}
printf("%d\n",bipartite_matching());
return 0;
}
/*
3 5
1 1
1 2
2 1
2 3
3 2
*/