uva 12168 - Cat vs. Dog(二分图匹配)
2015-09-23 22:20
453 查看
题目链接:uva 12168 - Cat vs. Dog
类似uva 12083
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
const int maxn = 505;
typedef pair<string,string> pii;
int N, M, K, L[maxn];
bool T[maxn];
vector<int> G[maxn];
vector<pii> C, D;
bool match(int u) {
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (!T[v]) {
T[v] = true;
if (!L[v] || match(L[v])) {
L[v] = u;
return true;
}
}
}
return false;
}
int KM () {
int ret = 0;
memset(L, 0, sizeof(L));
for (int i = 1; i <= N; i++) {
memset(T, false, sizeof(T));
if (match(i))
ret++;
}
return ret;
}
void init () {
C.clear();
D.clear();
scanf("%d%d%d", &N, &M, &K);
char s1[10], s2[10];
for (int i = 1; i <= K; i++) {
scanf("%s%s", s1, s2);
if (s1[0] == 'C')
C.push_back(make_pair(s1, s2));
else
D.push_back(make_pair(s1, s2));
}
N = C.size();
M = D.size();
for (int i = 0; i < N; i++) {
G[i+1].clear();
for (int j = 0; j < M; j++)
if (C[i].first == D[j].second || C[i].second == D[j].first)
G[i+1].push_back(j+1);
}
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
int n = KM();
printf("%d\n", K - n);
}
return 0;
}
类似uva 12083
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
const int maxn = 505;
typedef pair<string,string> pii;
int N, M, K, L[maxn];
bool T[maxn];
vector<int> G[maxn];
vector<pii> C, D;
bool match(int u) {
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (!T[v]) {
T[v] = true;
if (!L[v] || match(L[v])) {
L[v] = u;
return true;
}
}
}
return false;
}
int KM () {
int ret = 0;
memset(L, 0, sizeof(L));
for (int i = 1; i <= N; i++) {
memset(T, false, sizeof(T));
if (match(i))
ret++;
}
return ret;
}
void init () {
C.clear();
D.clear();
scanf("%d%d%d", &N, &M, &K);
char s1[10], s2[10];
for (int i = 1; i <= K; i++) {
scanf("%s%s", s1, s2);
if (s1[0] == 'C')
C.push_back(make_pair(s1, s2));
else
D.push_back(make_pair(s1, s2));
}
N = C.size();
M = D.size();
for (int i = 0; i < N; i++) {
G[i+1].clear();
for (int j = 0; j < M; j++)
if (C[i].first == D[j].second || C[i].second == D[j].first)
G[i+1].push_back(j+1);
}
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
int n = KM();
printf("%d\n", K - n);
}
return 0;
}
相关文章推荐
- 简单工厂模式、工厂方法模式和抽象工厂模式小结
- MySQL函数的使用
- 有一个序列集合,如[1,1,1,2,3,3,2]统计这个集合中所有元素出现的次数,如1出现的次数为3次,2出现2次
- xss<script>alert("11");</script>
- 河南理工大学14级数据结构第一次上机实验课题试验
- windows手动启动服务方法
- vagrant启动报错The following SSH command responded with a non-zero exit status.解决方法
- NYOJ 518 取球游戏(博弈问题)
- 如何编写高质量JavaScript代码
- 韩顺平 java 第十七讲 排序
- Theme.AppCompat.Light无法找到问题
- 如何编写高质量JavaScript代码
- Javascript--数组转换成字符串
- 测试用例
- 【C语言】求1000-2000年的闰年,并统计个数
- HTTP状态码
- 自学android 碰到的知识点总结
- 选课系统TeacherDao代码(1.0尚有改进)
- IOS主AppDelegate详解
- Android 代码版本控制器之—— SVN