洛谷多校Round5 Change

题目大意:

acm比赛有若干道题目,每个题目有一些别称,可以交换题目顺序,使得第i道题以第i个字母开头

比如A题以A开头,B题以B开头

不超过26个题目

,别称不超过100个

就是一道二分图匹配问题,只要匹配满了就行

一个细节,如果有8道题的话,第9个字母以后的都不用管了

要么在输入处理一下,要么就把左边的个数设置一下就可以了

代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 510;
int uN, vN;
int g[maxn][maxn];
int linker[maxn];
bool used[maxn];
bool dfs(int u)
{
    for (int v = 0; v < vN; v++)
    {
        if (g[u][v] && !used[v])
        {
            used[v] = true;
            if (linker[v] == -1 || dfs(linker[v]))
            {
                linker[v] = u;
                return 1;
            }
        }
    }
    return 0;
}
int hungary()
{
    int res = 0;
    memset(linker, -1, sizeof(linker));
    for (int u = 0; u < uN; u++)
    {
        memset(used, false, sizeof(used));
        if (dfs(u))res++;
    }
    return res;
}
int n;
int main()
{
    ios::sync_with_stdio(false);
    string ans = "Yes";
    cin >> n;
    uN = 26;
    vN = n;
    for (int i = 0; i < n; i++)
    {
        int rtt;
        cin >> rtt;
        for (int j = 1; j <= rtt; j++)
        {
            string s;
            cin >> s;
            int ord = s[0] - 'a';
            g[ord][i] = 1;
        }
    }
    if (hungary() == n)
        cout << "Yes\n";
    else
        cout << "No\n";
    return 0;
}

 

posted @ 2020-04-02 16:30  Amazonite  阅读(125)  评论(0编辑  收藏  举报