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