HDU - 1083 Courses (二分图最大匹配模板)
Posted tianwell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 1083 Courses (二分图最大匹配模板)相关的知识,希望对你有一定的参考价值。
题意:给出P门课程,N个学生。
每一门课程可能有多个学生感兴趣
然后我们需要匹配,使得每一门课程都只包含一名对其感兴趣的学生
问:能否匹配成立
思路:这个就是典型的二分图匹配问题。常用匈牙利算法
完整代码:(一开始写成了无向图....)写成有向图是因为学生是可以剩余的
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int maxn = 1e3; const int maxm = 1e6; int match[maxn]; int vis[maxn]; int head[maxn]; int top,ans; int n,m; struct Edge int v,next; edge[maxm]; void add(int u,int v) edge[top].v = v; edge[top].next = head[u]; head[u] = top++; void init() memset(head,-1,sizeof(head)); memset(match,0,sizeof(match)); top = ans = 0; //匈牙利算法:递归找增广路径 bool Find(int u) for(int i = head[u]; ~i ;i =edge[i].next) int v = edge[i].v; if(!vis[v]) vis[v] = 1; if(!match[v]||Find(match[v])) match[v] = u; return true; return false; int main() int T; cin>>T; while(T--) cin>>n>>m; int num; init(); for(int i = 1;i<=n;i++) cin>>num; while(num--) int v; cin>>v; add(i,v); for(int i = 1;i<=n;i++) memset(vis,0,sizeof(vis)); if(Find(i)) ans++; if(ans==n) cout<<"YES"<<endl; else cout<<"NO"<<endl;
以上是关于HDU - 1083 Courses (二分图最大匹配模板)的主要内容,如果未能解决你的问题,请参考以下文章