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

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. [翻译] 物理引擎javascript实现

    转自: How Physics Engines Work 高中物理全还给老师了啊啊啊啊啊啊 牛顿第二定律 物体加速度的大小跟物体受到的作用力成正比,跟物体的质量成反比,加速度的方向跟合外力的方向相同. ...

  2. 381. Insert Delete GetRandom O(1) - Duplicates allowed

    Design a data structure that supports all following operations in average O(1) time. Note: Duplicate ...

  3. numpy windows环境下载安装

    由于numpy在多个平台下非常流行,以至于习惯WINDOWS环境下的用户可能找不到下载位置,更多的时候会下载到zip文件,然后需要安装编译(自然通不过) 1.http://www.scipy.org/ ...

  4. su和sudo命令的用法

    为了安全起见,尽量不要用root用户去做所有事情,因为一旦执行了错误的命令,可能会直接导致系统崩溃. 一.su命令 su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,切换到其他用 ...

  5. suse 11 sp4 设置yast 安装源

    suse yast 软件管理工具,用户在初始安装系统时,可能会遗漏比较多的库和工具,那么为了方便大家日后可以随时添加,用户可以选择将安装ISO 文件添加到 suse 的yast 安装源上. 用户首先创 ...

  6. 两句话跳转QQ聊天界面 通过web方式

    NSString *qq=[NSString stringWithFormat:"]; NSURL *url2 = [NSURL URLWithString:qq]; if ([[UIApp ...

  7. [WOJ4354] 蜀石经

    题目链接: 点我 题目分析: 大模拟,貌似\(O(n^2)\)也可以卡常过,复杂度正确的做法是用优先队列维护. 代码: #include<bits/stdc++.h> #define N ...

  8. ssrs 里 表头 分页后显示

    1. 列组,箭头,高级 2.点击行组,静态 3. 设置静态行组 属性

  9. HTML实例之简单的网页布局

    需求: <html> <head> <title>简单的表格网页布局</title> <meta charset="UTF-8" ...

  10. Ubuntu-apt安装Jenkins

    系统环境: Ubuntu 16.0.4 2CPU,8G 1.默认Ubuntu软件包里没有Jenkins 2.系统里添加存储密钥 wget -q -O - https://pkg.jenkins.io/ ...