这个相当于把两两的关系搞成图
求的是所有边的子集,使得这个子集没有两两无公共点
这个代码不好理解
#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 */
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-16 11:05:21