某谷某模拟赛碰到二分图的签到题不会写丢人 QAQ
回来补个板子 QwQ
# 模板
P3386 【模板】二分图最大匹配
思路:
左边点 个, 右边点 个, 表示左边 号与右边 号节点连接。
依次给左边每个点找对象,其过程中:若遇到某个右边点已经有对象,让这个右边点的对象(也就是之前匹配的左边点)再重新找个对象试试 emm
code:
bool dfs(int np) | |
{ | |
rep(i, 1, n2) // 匹配右边第 i 号 | |
{ | |
if (!vis[i] && e[np][i]) | |
{ | |
vis[i] = 1; | |
if (!match[i] || dfs(match[i])) // 若该点已经被匹配,让其匹配的左边点再找个新的对象 QwQ | |
{ | |
match[i] = np; | |
return 1; | |
} | |
} | |
} | |
return 0; | |
} | |
int main() | |
{ | |
scanf("%d%d%d", &n1, &n2, &m); | |
int u, v; | |
rep(i, 1, m) | |
{ | |
scanf("%d%d", &u, &v); | |
e[u][v] = 1; | |
} | |
rep(i, 1, n1) // 匹配左边第 i 号 | |
{ | |
memset(vis, 0, sizeof(vis)); | |
if (dfs(i)) | |
ans++; | |
} | |
printf("%d\n", ans); | |
return 0; | |
} |
# 杂题
话说在这搬运题目好像没版权呀,,算了反正也没人看 qwq
题意:
某 dl 出题人想要每个题的 题号 与题 目名称的首字母 对应,每个题目有多个备选名称,问是否存在一种符合的方案。
例如:
//合法 | |
bqqqww | |
aqwq ccc | |
//8行 | |
aabb bbaa | |
ccc |
思路:
二分图匹配裸题,菜死了 QAQ
输入格式:
个题,每个题 个备用名,字符串给出。
code:
#include <cstdio> | |
#include <iostream> | |
#include <cstring> | |
#define rep(i,s,t) for(int i=s;i<=t;i++) | |
using namespace std; | |
const int MAXN = 33; | |
int n, m, ans, match[MAXN]; | |
char str[233]; | |
bool e[MAXN][MAXN], vis[MAXN]; | |
bool dfs(int np) | |
{ | |
rep (i, 1, n) | |
{ | |
if (!vis[i] && e[np][i]) | |
{ | |
vis[i] = 1; | |
if (!match[i] || dfs(match[i])) | |
{ | |
match[i] = np; | |
return 1; | |
} | |
} | |
} | |
return 0; | |
} | |
int main() | |
{ | |
//freopen("in.txt", "r", stdin); | |
scanf("%d", &n); | |
rep (i, 1, n) | |
{ | |
scanf("%d ", &m); | |
rep (j, 1, m) | |
{ | |
scanf("%s ", str); | |
e[i][str[0] - 'a' + 1] = 1; | |
} | |
} | |
rep (i, 1, n) | |
{ | |
memset(vis, 0, sizeof(vis)); | |
if (dfs(i)) | |
ans++; | |
} | |
if (ans == n) | |
printf("Yes\n"); | |
else | |
printf("No\n"); | |
return 0; | |
} |
好耶,又水了一篇文章。