当前位置: 代码迷 >> 综合 >> POJ1469[COURSES] 二分图最大匹配 匈牙利算法
  详细解决方案

POJ1469[COURSES] 二分图最大匹配 匈牙利算法

热度:13   发布时间:2023-11-06 08:27:16.0

题目链接


题意:题目大意:将vy个工作分配给vx个学生,求能不能每个同学都有分配到工作。


解题思路:二分图匹配,看匹配数是否等于课程数


#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 305;
const int P = 105;
int T[N], line[N], w[P][N];
int p, n;
bool find(int u){for ( int i=1; i<=n; i++ )if( !T[i] && w[u][i] ){T[i]=1;if( !line[i] || find(line[i]) ){line[i]=u;return true;}}return false;
} int Hungarian(){int ans=0;memset(line,0,sizeof(line));for ( int i=1; i<=p; i++ ){memset(T,0,sizeof(T));if( find(i) ) ans++;}return ans;
}int main(){int tt;scanf("%d", &tt );while( tt-- ){memset(w,0,sizeof(w));scanf("%d%d", &p, &n );for ( int i=1; i<=p; i++ ){int x;scanf("%d", &x );for ( int j=1; j<=x; j++ ){int v;scanf("%d", &v );w[i][v]=1;}}(Hungarian()==p) ? puts("YES") : puts("NO"); }
}