洛谷多校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; }