题意:
输入人数及课节数
接下来输入
课程的人数
例如
第一行3 1 2 3
相当于 3—1,3—2,3——3
所以解法用二分搜索
#include<iostream>
#include<cstring>
using namespace std;
const int xixi=1010;
int haha[xixi],g[xixi][xixi];
int visited[xixi];
int n,m;
bool dfs (int a)
{
for(int i=1;i<=n;i++)
{
if(g[a][i] && !visited[i])//第三点
{
visited[i]=1;
if(haha[i] || dfs(haha[i]))//第一点
{
haha[i]=a;//第二点
return true;
}
}
}
return false;
}
int main ()
{
int k;
cin>>k;
while(k--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int as,asd;
cin>>as;
while(as--)
{
cin>>asd;
g[i][asd]=1;
}
}
int sum=0;
memset(haha,-1,sizeof(haha));
for(int i=1;i<=n;i++)
{
memset(visited,0,sizeof(visited));
if(dfs(i))
sum++;
}
if(sum == m)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
题解是百度的,第一点:如果a-i未匹配 或者 i匹配 走匹配边
第二点暂时没懂怎么非匹配边和匹配边交换的
第三点 如果a-i之间有边并且没被用过