COURSES

来源:互联网 发布:网络什么客 编辑:程序博客网 时间:2024/05/21 22:48

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