您的位置:首页 > 其它

poj 1469 COURSES 最大二分匹配

2011-01-29 21:05 417 查看
这题也是赤裸裸的最大二分匹配。在最后加个判断即可。

注意,用cin会超时,要用scanf

#include<iostream>
using namespace std;

const int MAX = 305;

bool arcs[MAX][MAX];
bool isvisit[MAX];
int match[MAX];
int n, m;

bool find(int u)
{
for (int i = 1; i <= m; i++)
if (arcs[u][i] && !isvisit[i])
{
isvisit[i] = true;
if (!match[i] || find(match[i]))
{
match[i] = u;
return true;
}
}

return false;
}

int main()
{
int k;
int num;

int cases;
cin >> cases;
while (cases--)
{
scanf("%d%d", &n, &m);
memset(arcs, false, sizeof(arcs));
memset(match, 0, sizeof(match));
for (int i = 1; i <= n; i++)
{
scanf("%d", &k);
for (int j = 0; j < k; j++)
{
scanf("%d", &num);
arcs[i][num] = true;
}
}

int ans = 0;
for (int i = 1; i <= n; i++)
{
memset(isvisit, false, sizeof(isvisit));
if (find(i))
ans++;
}

if (ans == n)
printf("YES\n");
else
printf("NO\n");

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: