COURSES

题意:
输入人数及课节数
接下来输入
课程的人数
例如
第一行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之间有边并且没被用过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值