A Plug for UNIX UVA - 753(网络流)
题意:n个插座,m个设备及其插头类型,k种转换器,没有转换器的情况下插头只能插到类型名称相同的插座中,问最少剩几个不匹配的设备
lrj紫书里面讲得挺好的。
先跑一遍floyd,看看插头类型a能否转换为b
然后构造网络
源点为0, 汇点为n + m + 1,源点连插头 容量为1,插座连汇点,容量为1
插头和插座能互相转换的容量为INF,跑一遍最大流 m - 最大流就是答案
顺便粘一下dinic的板子
#include <bits/stdc++.h>
using namespace std; inline int read() {
int x = , f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar();}
while (ch >= '' && ch <= '') { x = x * + ch - ; ch = getchar();}
return x * f;
} const int N = ;
const int INF = 0x3f3f3f3f;
int n, m, k, tol, cnt;
map<string, int> mp;
vector<int> a;
vector<int> b;
bool f[N][N];
struct Edge { int v, f, next; } edge[N * ];
int head[N], level[N], iter[N]; inline void init() {
mp.clear();
a.clear();
b.clear();
tol = cnt = ;
memset(f, , sizeof(f));
memset(head, -, sizeof(head));
} inline void addedge(int u, int v, int f) {
edge[cnt].v = v; edge[cnt].next = head[u]; edge[cnt].f = f; head[u] = cnt++;
} void floyd() {
for (int k = ; k <= tol; k++) {
for (int i = ; i <= tol; i++) {
for (int j = ; j <= tol; j++) {
f[i][j] = f[i][j] || (f[i][k] && f[k][j]);
}
}
}
} bool bfs(int s, int t) {
for (int i = ; i <= t; i++) iter[i] = head[i], level[i] = -;
level[s] = ;
queue<int> que;
que.push(s);
while (!que.empty()) {
int u = que.front(); que.pop();
for (int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].v, f = edge[i].f;
if (f > && level[v] == -) {
level[v] = level[u] + ;
que.push(v);
}
}
}
return level[t] != -;
} int dfs(int u, int t, int f) {
if (!f || u == t) return f;
int flow = , w;
for (int i = iter[u]; ~i; i = edge[i].next) {
iter[u] = i;
int v = edge[i].v;
if (level[v] == level[u] + && edge[i].f > ) {
w = dfs(v, t, min(f, edge[i].f));
if (w == ) continue;
f -= w;
edge[i].f -= w;
edge[i^].f += w;
flow += w;
if (f <= ) break;
}
}
return flow;
} int dinic(int s, int t) {
int ans = ;
while (bfs(s, t)) ans += dfs(s, t, INF);
return ans;
} int main() {
int T = read();
while (T--) {
init();
n = read();
for (int i = ; i <= n; i++) {
string s;
cin >> s;
mp[s] = i;
a.emplace_back(i);
tol++;
}
m = read();
for (int i = ; i <= m; i++) {
string str1, s;
cin >> str1 >> s;
if (!mp.count(s)) {
mp[s] = ++tol;
}
b.emplace_back(mp[s]);
}
k = read();
for (int i = ; i <= k; i++) {
string s1, s2;
cin >> s1 >> s2;
if (!mp.count(s1)) mp[s1] = ++tol;
if (!mp.count(s2)) mp[s2] = ++tol;
f[mp[s1]][mp[s2]] = ;
}
for (int i = ; i <= tol; i++) f[i][i] = ;
floyd();
for (int i = ; i <= m; i++) {
addedge(, i, );
addedge(i, , );
}
for (int i = ; i <= n; i++) {
addedge(m + i, n + m + , );
addedge(n + m + , m + i, );
}
for (int i = ; i < m; i++) {
for (int j = ; j < n; j++) {
if (!f[b[i]][a[j]]) continue;
addedge(i + , m + j + , INF);
addedge(m + j + , i + , );
}
}
printf("%d\n", m - dinic(, n + m + ));
if (T) puts("");
}
return ;
}
A Plug for UNIX UVA - 753(网络流)的更多相关文章
- POJ 1087 A Plug for UNIX / HDU 1526 A Plug for UNIX / ZOJ 1157 A Plug for UNIX / UVA 753 A Plug for UNIX / UVAlive 5418 A Plug for UNIX / SCU 1671 A Plug for UNIX (网络流)
POJ 1087 A Plug for UNIX / HDU 1526 A Plug for UNIX / ZOJ 1157 A Plug for UNIX / UVA 753 A Plug for ...
- 【uva 753】A Plug for UNIX(图论--网络流最大流 Dinic)
题意:有N个插头,M个设备和K种转换器.要求插的设备尽量多,问最少剩几个不匹配的设备. 解法:给读入的各种插头编个号,源点到设备.设备通过转换器到插头.插头到汇点各自建一条容量为1的边.跑一次最大流就 ...
- C - A Plug for UNIX POJ - 1087 网络流
You are in charge of setting up the press room for the inaugural meeting of the United Nations Inter ...
- UVA 753 - A Plug for UNIX(网络流)
A Plug for UNIX You are in charge of setting up the press room for the inaugural meeting of the U ...
- UVA 753 A Plug for UNIX(二分图匹配)
A Plug for UNIX You are in charge of setting up the press room for the inaugural meeting of the Unit ...
- uva753 A Plug for UNIX 网络流最大流
C - A Plug for UNIX You are in charge of setting up the press room for the inaugural meeting of t ...
- POJ1087 A Plug for UNIX(网络流)
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total S ...
- poj 1087 C - A Plug for UNIX 网络流最大流
C - A Plug for UNIXTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contes ...
- UVa753/POJ1087_A Plug for UNIX(网络流最大流)(小白书图论专题)
解题报告 题意: n个插头m个设备k种转换器.求有多少设备无法插入. 思路: 定义源点和汇点,源点和设备相连,容量为1. 汇点和插头相连,容量也为1. 插头和设备相连,容量也为1. 可转换插头相连,容 ...
随机推荐
- GWT中自定义你的"cell"
GWT内部提供了CellTable组件,它允许自由增加column以及cell,在设定column之后就是在其中填充cell了.但GWT所提供的CellTable样式确实不敢恭维,为了解决这一问题,在 ...
- [C++] 贪心算法之活动安排、背包问题
一.贪心算法的基本思想 在求解过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解. 从贪心算法的定义可以看出,贪心算法不是从整体上考 ...
- java写出进程条代码
package com.ds; import java.awt.Color; import java.awt.Toolkit; import javax.swing.ImageIcon; import ...
- ThreadPoolTaskExecutor的配置解释
ThreadPoolTaskExecutor的配置在网上找了很多解释没找到,看了下ThreadPoolExecutor的配置,名字差不多,应该含义也差不多.只不过ThreadPoolTaskExecu ...
- __thiscalll C++底层识别成员函数
问题描述: class myClass { public: void SetNumber(int nNumber) { m_nInt = nNumber; } private: int m_nInt; ...
- OpenCV 视频监控(Video Surveilance)的算法体系
如前面说到的,OpenCV VS提供了6组算法的接口,分别是:前景检测.新目标检测.目标跟踪.轨迹生成.跟踪后处理.轨迹分析,除了轨迹生成用于轨迹数据的保存以外,其他5个部分都是标准的视频监控算法体系 ...
- iOS中的数据存储
SQLite3 SQLite3是一款开源的嵌入式关系型数据库,可移植性好,易使用,内存开销小. SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中. SQLite3常用的4种 ...
- C#引用类库时出现黄色三角加感叹号的处理
C#引用类库时出现黄色三角加感叹号的处理方法 一个C#项目 在引用中有个引用项上有个黄色三角加感叹号 导致报错 类库的目标框架不一致,修改成一样就可以了. 选中类库右击属性:“目标框架”,修改成与引用 ...
- scrapy(1)安装
用的是python3.6 pip install -i https://pypi.douban.com/simple/ scrapy scrapy startproject Article scrap ...
- js常见的字符串及数组处理
最近工作设计前台比较多,由于好久没动前台,或者使用前台框架习惯了,js有点生,将常见的字符串处理忘了,在这里整理一下常见的,以便于查阅: 1.substr():字符串分割,第一个是开始的下标,第二个是 ...