1. 程式人生 > >[二分圖最大匹配]LuoGu P2417 課程

[二分圖最大匹配]LuoGu P2417 課程

str pla get temp 如果 problem con 輸入輸出格式 int

題目地址LuoGu P2417 課程

題目描述
n個學生去p個課堂,每一個學生都有自己的課堂,並且每個學生只能去一個課堂,題目要求能夠安排每一個課堂都有人嗎?

輸入輸出格式
輸入格式:
第一行是測試數據的個數,

每組測試數據的開始分別是p和n,

接著p行,每行的開始是這個課堂的學生人數m,接著m個數代表該課堂的學生編號

輸出格式:
如果該組數據能夠這樣安排就輸出YES,否則輸出NO。

輸入輸出樣例
輸入樣例#1:

2
3 3
3 1 2 3
2 1 2
1 1
3 3
2 1 3
2 1 3
1 1

輸出樣例#1:

YES
NO

說明
對於100%的數據, n\(\le 100\),\(m\le 20000\)




二分圖最大匹配..裸的 沒有什麽難度 跑一遍就過了 唯一需要考慮的就是 如果n>m的話 我們就直接輸出NO

扔代碼..

//#define fre yes

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int maxn = 20010 * 2;
int curch[maxn];
int head[maxn];
int ver[maxn];
int to[maxn];

bool Vis[maxn];

int n,m,k,tot,ans;

template<typename T>inline void read(T&x)
{
    x = 0;char c;int lenp = 1;
    do { c = getchar();if(c == '-') lenp = -1; } while(!isdigit(c));
    do { x = x * 10 + c - '0';c = getchar(); } while(isdigit(c));
    x *= lenp;
}

void addedge(int x,int y)
{
    ver[tot] = y;
    to[tot] = head[x];
    head[x] = tot++;
}

bool can(int x)
{
    for (int i=head[x];~i;i=to[i])
    {
        int y = ver[i];
        if(!Vis[y])
        {
            Vis[y] = 1;
            if(!curch[y]||can(curch[y]))
            {
                curch[y] = x;
                return 1;
            }
        } } return 0;
}

int main()
{
    read(k);
    while(k--)
    {
        // for (int i=0;i<maxn;i++) { curch[i] = 0;head[i] = -1;ver[i] = 0;to[i] = 0; }
        memset(curch,0,sizeof(curch));
        memset(head,-1,sizeof(head));
        memset(ver,0,sizeof(ver));
        memset(to,0,sizeof(to));
        ans = 0;tot = 0;

        read(n);read(m);
        for (int i=1;i<=n;i++)
        {
            int x;
            read(x);
            for (int j=1;j<=x;j++)
            {
                int y;
                read(y);
                addedge(i,y);
            }
        } 
        
        if(n > m)
        {
            puts("NO");
            continue;
        }
        
        for (int i=1;i<=n;i++)
        {
            memset(Vis,false,sizeof(Vis));
            if(can(i)) ans++;
        } if(ans == n) puts("YES");
        else puts("NO");
    } return 0;
}

[二分圖最大匹配]LuoGu P2417 課程