关键在建图,转换器连一条容量无限的边表示可以转化无数次,设备的插头连源点,插座连汇点。

dinic手敲已熟练,输出格式又被坑,总结一下,输出空行多case的,一个换行是必要的,最后一个不加空行,有Testcase最后一个不要换行,没有testcase最后一个要加换行,想起那天gold miner PE了两发。

对dinic网络流的简单理解:bfs找有没有增广路,dfs增广。

关键的概念:反向边,给一个反悔的机会。

#include<bits/stdc++.h>
using namespace std;
int n,m;
map<string,int> mp;
map<string,int>::iterator it;
#define MP make_pair
#define PB push_back
#define fi first
#define se second int id_cnt; int ID(const string &s)
{
if((it=mp.find(s))!=mp.end()) return it->se;
mp.insert(MP(s,id_cnt));
return id_cnt++;
} const int maxn = , INF = 0x3f3f3f3f;
int S,T;
struct Edge
{
int v,nxt,cap,flow;
}edges[maxn<<]; int head[maxn],cur[maxn],ecnt; void addEdge(int u,int v,int c)
{
edges[ecnt].nxt = head[u];
edges[ecnt].cap = c;
edges[ecnt].flow = ;
edges[ecnt].v = v;
head[u] = ecnt++;
} void AddEdge(int u,int v,int c)
{
addEdge(u,v,c);
addEdge(v,u,);
} int d[maxn];
bool vis[maxn];
bool bfs()
{
memset(vis,,sizeof(bool)*id_cnt);
queue<int> q;
q.push(S);
d[S] = ; vis[S] = true;
while(q.size()){
int u = q.front(); q.pop();
for(int i = head[u]; ~i; i = edges[i].nxt){
Edge &e = edges[i];
if(!vis[e.v] && e.cap>e.flow){
vis[e.v] = true;
d[e.v] = d[u]+;
q.push(e.v);
}
}
}
return vis[T];
} int dfs(int u,int a)
{
if(u == T||!a) return a;
int flow = ,f;
for(int &i = cur[u]; ~i; i = edges[i].nxt){
Edge &e = edges[i];
if(d[e.v] == d[u]+ && (f = dfs(e.v,min(a,e.cap-e.flow))>)){
e.flow += f;
edges[i^].flow -= f;
flow += f;
a -= f;
if(!a) break;
}
}
return flow;
} int MaxFlow()
{
int ret = ;
while(bfs()){
memcpy(cur,head,sizeof(int)*id_cnt);
ret += dfs(S,INF);
}
return ret;
} void init()
{
memset(head,-,sizeof(head));
mp.clear(); id_cnt = ;
ecnt = ;
} int main()
{
//freopen("in.txt","r",stdin);
char str1[],str2[];
int Testcase; scanf("%d",&Testcase);
S = ; T = ;
while(Testcase--){
int n,m,k;
init();
scanf("%d",&n);
for(int i = ; i < n; i++){
scanf("%s",str1);
AddEdge(ID(str1),T,);
}
scanf("%d",&m);
for(int i = ; i < m; i++){
scanf("%s%s",str1,str2);
AddEdge(S,ID(str2),);
}
scanf("%d",&k);
for(int i = ; i < k; i++){
scanf("%s%s",str1,str2);
AddEdge(ID(str1),ID(str2),INF);
}
int ans = m-MaxFlow();
printf("%d\n",ans);
if(Testcase)putchar('\n');
}
return ;
}

UVA 753 A Plug for UNIX (最大流)的更多相关文章

  1. UVa 753 A Plug for UNIX (最大流)

    题意:给定 n 种插座,m种设备,和k个转换器,问你最少有几台设备不能匹配. 析:一个很裸的网络流,直接上模板就行,建立一个源点s和汇点t,源点和每个设备连一条边,每个插座和汇点连一条边,然后再连转换 ...

  2. ZOJ1157, POJ1087,UVA 753 A Plug for UNIX (最大流)

    链接 : http://acm.hust.edu.cn/vjudge/problem/viewProblem.action? id=26746 题目意思有点儿难描写叙述 用一个别人描写叙述好的. 我的 ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. UVa 753 - A Plug for UNIX(最大流)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. UVA 753 A Plug for UNIX 电器插座(最大基数匹配,网络流)

    题意: 给n个插座,m个设备(肯定要插电了),k种转换头可无限次使用(注意是单向的),问有多少设备最终是不能够插上插座的? 分析: 看起来就是设备匹配插座,所以答案不超过m.这个题适合用网络流来解. ...

  8. UVA 753 A Plug for UNIX

    最大流解决 . 设置源点 0,连接所有设备(device) .设备-插头 -汇点 #include <map> #include <set> #include <list ...

  9. UVA - 753 A Plug for UNIX(网络流)

    题意 给定一些插头设备和插座,有一些方法可以把其中一些插头变成另一种插头.求无法匹配插座的插头设备个数. 题解 用\(map\)给每个字符串标号为\(a_i\)和\(b_i\). 读入每种改变插头的方 ...

随机推荐

  1. 3.2-3.3 Hive中常见的数据压缩

    一.数据压缩 1. 数据压缩 数据量小 *本地磁盘,IO *减少网络IO Hadoop作业通常是IO绑定的; 压缩减少了跨网络传输的数据的大小; 通过简单地启用压缩,可以提高总体作业性能; 要压缩的数 ...

  2. FlashkUI v1.33 发布(提供移动设备支持)

    v1.33 Beta更新内容:增加对移动设备的支持,新增自定义双渲染器双层树组件.List增加按数据子项排序功能. <ignore_js_op> 介绍: Flex已经不作为Adobe官方支 ...

  3. LeetCode: 520 Detect Capital(easy)

    题目: Given a word, you need to judge whether the usage of capitals in it is right or not. We define t ...

  4. 前端之CSS2

    CSS盒子模型 CSS盒子模型介绍 盒子模型解释 元素在页面中显示成一个方块,类似一个盒子,CSS盒子模型就是使用现实中盒子来做比喻,帮助我们设置元素对应的样式. 盒子模型示意图如下: 把元素叫做盒子 ...

  5. throw UnsupportedOperationException

    package org.usc.action; import java.util.ArrayList; import java.util.Arrays; import java.util.List; ...

  6. 微信API接口文档

    传送门

  7. uoj#79. 一般图最大匹配(带花树)

    传送门 带花树 不加证明的说一下过程好了:每次从一个未匹配点\(S\)出发bfs,设\(S\)为\(1\)类点,如果当前点\(v\)在本次bfs中未经过,分为以下两种情况 1.\(v\)是未匹配点,那 ...

  8. 洛谷P2480 [SDOI2010]古代猪文(卢卡斯定理+中国剩余定理)

    传送门 好吧我数学差的好像不是一点半点…… 题目求的是$G^{\sum_{d|n}C^d_n}mod\ 999911659$ 我们可以利用费马小定理$a^{k}\equiv a^{k\ mod\ (p ...

  9. IT兄弟连 JavaWeb教程 Servlet会话跟踪 获取Session对象

    Session对象的获取有两种: ●  有参方法: HttpSession request.getSession(boolean isNew) 参数: true:获取一个Session对象,如果之前S ...

  10. Unable to load script from assets 'index.android.bundle'.Make sure your bundle is packaged correctly or you're running a packager server

    curl -k 'http://localhost:8081/index.android.bundle?platform=android' > android/app/src/main/asse ...