POJ1087 A Plug for UNIX(网络流)
在会议开始之前,你收集所有记者想要使用的设备,并尝试设置它们。你注意到有些设备使用没有插座的插头。你想知道这些设备是否来自建造这个房间时并不存在的国家。对于一些插座,有几个设备使用相应的插头。对于其他插座,没有使用相应插头的设备。
为了解决这个问题,你可以去附近的零件供应商店。该商店出售的适配器允许在不同类型的插座上使用一种类型的插头。此外,还允许将适配器插入到其他适配器中。该商店没有为所有可能的插头和插座组合提供适配器,但实际上他们有无限的供应。
输入
输入将包括一种情况。第一行包含一个正整数n (1 <= n <= 100),表示房间中插座的数量。接下来的n行列出了在房间中找到的容器类型。每个容器类型由最多24个字母数字字符组成的字符串组成。下一行包含一个正整数m (1 <= m <= 100),表示要插入的设备数量。接下来的m行每一行都列出了一个设备的名称,后面跟着它使用的插头类型(与它需要的插座类型相同)。设备名称是一个最多24个字母数字组成的字符串
字符。没有两个设备会有完全相同的名称。插头类型与设备名称之间用空格分隔。下一行包含一个正整数k (1 <= k <= 100),表示可用的适配器的不同种类的数量。接下来的k行描述了各种适配器,给出了适配器提供的插座类型,后面是空格,后面是插头类型。
输出
包含单个非负整数的行,它表示不能插入的设备的最小数目。
代码:
1 //题目上面说的是一种电脑有一种类型的插头,电脑要充电就必须找对应的插座。除此之外你还可以找一个转换器去把电脑插头类型转换一下
2 //那就可以定义一个st代表最大流起点,en代表最大流终点。
3 //
4 //st起点就要和每一台电脑相连,然后再让电脑和转换器连接(连接要求就是连接器开头要和电脑插头类型一样)
5 //最后再和插头相连。插头再和终点en相连就可以了。具体看代码吧
6 //
7 #include<stdio.h>
8 #include<string.h>
9 #include<iostream>
10 #include<algorithm>
11 #include<queue>
12 #include<map>
13 using namespace std;
14 const int maxn=1005;
15 const int INF=0x3f3f3f3f;
16 int head[maxn],cnt,st,en,dis[maxn],cur[maxn];
17 map<string,int>r;
18 struct edge
19 {
20 int v,next,c,flow;
21 } e[maxn];
22 struct shudui
23 {
24 string q;
25 int qq;
26 } p[maxn];
27 void add_edge(int x,int y,int z)
28 {
29 e[cnt].v=y;
30 e[cnt].c=z;
31 e[cnt].flow=0;
32 e[cnt].next=head[x];
33 head[x]=cnt++;
34 }
35 bool bfs()
36 {
37 memset(dis,0,sizeof(dis));
38 dis[st]=1;
39 queue<int>r;
40 r.push(st);
41 while(!r.empty())
42 {
43 int x=r.front();
44 r.pop();
45 for(int i=head[x]; i!=-1; i=e[i].next)
46 {
47 int v=e[i].v;
48 if(!dis[v] && e[i].c>e[i].flow)
49 {
50 dis[v]=dis[x]+1;
51 r.push(v);
52 }
53 }
54 }
55 return dis[en];
56 }
57 int dinic(int s,int limit)
58 {
59 if(s==en || !limit) return limit;
60 int ans=0;
61 for(int &i=cur[s]; i!=-1; i=e[i].next)
62 {
63 int v=e[i].v,feed;
64 if(dis[v]!=dis[s]+1) continue;
65 feed=dinic(v,min(limit,e[i].c-e[i].flow));
66 if(feed)
67 {
68 e[i].flow+=feed;
69 e[i^1].flow-=feed;
70 limit-=feed;
71 ans+=feed;
72 if(limit==0) break;
73 }
74 }
75 if(!ans) dis[s]=-1;
76 return ans;
77 }
78 int main()
79 {
80 int n,m,k,index=1;
81 while(~scanf("%d",&n))
82 {
83 cnt=0;
84 memset(head,-1,sizeof(head));
85 index=1;
86 string qq,q;
87 st=0;
88 en=1;
89 for(int i=2; i<=n+1; ++i)
90 {
91 cin>>q;
92 r[q]=++index;
93 add_edge(r[q],en,1); //插头和终点相连
94 add_edge(en,r[q],0);
95 }
96 scanf("%d",&m);
97 index=n+2+2*m;
98 for(int i=n+2; i<=n+1+m; ++i)
99 {
100 cin>>q>>q;
101 p[i-n-1].q=q;
102 p[i-n-1].qq=i+m;
103 add_edge(st,i,INF); //电脑和起点相连
104 add_edge(i,st,0);
105 add_edge(i,i+m,1); //这里也就是对电脑进行拆点了,不拆点的话应该也可以
106 add_edge(i+m,i,0);
107 if(r[q]==0) r[q]=++index;
108 add_edge(i+m,r[q],1); //找到对应插头进行连接
109 add_edge(r[q],i+m,0);
110
111 }
112 scanf("%d",&k);
113 while(k--)
114 {
115 cin>>qq>>q;
116 add_edge(r[qq],r[q],INF); //转换器能使用多次,所以要建一个容量为INF的边
117 add_edge(r[q],r[qq],0);
118 }
119 r.clear();
120 int ans=0;
121 while(bfs())
122 {
123 for(int i=0; i<=index; i++)
124 cur[i]=head[i];
125 ans+=dinic(st,1); //1可以改成无穷大
126 }
127 printf("%d\n",m-ans);
128 }
129
130 return 0;
131 }
POJ1087 A Plug for UNIX(网络流)的更多相关文章
- POJ1087 A Plug for UNIX —— 最大流
题目链接:https://vjudge.net/problem/POJ-1087 A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K T ...
- POJ1087 A Plug for UNIX(网络流)
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total S ...
- POJ1087:A Plug for UNIX(最大流)
A Plug for UNIX 题目链接:https://vjudge.net/problem/POJ-1087 Description: You are in charge of setting u ...
- 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 ...
- 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 ...
- 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 ...
- POJ1087 A Plug for UNIX 【最大流】
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13855 Accepted: 4635 ...
- UVa753/POJ1087_A Plug for UNIX(网络流最大流)(小白书图论专题)
解题报告 题意: n个插头m个设备k种转换器.求有多少设备无法插入. 思路: 定义源点和汇点,源点和设备相连,容量为1. 汇点和插头相连,容量也为1. 插头和设备相连,容量也为1. 可转换插头相连,容 ...
- POJ1087 A Plug for UNIX 2017-02-12 13:38 40人阅读 评论(0) 收藏
A Plug for UNIX Description You are in charge of setting up the press room for the inaugural meeting ...
随机推荐
- 深入理解static、volatile关键字
static 意思是静态的,全局的.被修饰的东西在一定范围内是共享的,被类的所有实例共享,这时候需要注意并发读写的问题. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们. ...
- iTerm2 实现 ssh 自动登录,并使用 Zmodem 实现快速传输文件
原文链接:https://fuckcloudnative.io/posts/iterm2-auto-login/ 对于 YAML 工程师来说,我们经常需要 ssh 登录不同的服务器,每次登录时都要经历 ...
- sa-token 之权限验证
权限验证 核心思想 所谓权限验证,验证的核心就是当前账号是否拥有一个权限码 有:就让你通过.没有:那么禁止访问 再往底了说,就是每个账号都会拥有一个权限码集合,我来验证这个集合中是否包括我需要检测的那 ...
- 安装percona-toolkit
http://www.percona.com/software/percona-toolkityum -y install perl-DBIyum -y install perl-DBD-mysqly ...
- service自动发现,yaml文件管理内外部端口访问
service服务发现 [root@k8s-master ~]# vim busybox-5d4f595646-dzjv4.yaml apiVersion: v1 kind: Pod metadata ...
- SQL Server management studio使用sa连接时报错与伺服器的连接已成功,但在登入程序是发生错误
使用Sql Server management studio的sa用户连接数据库时,报如下错误 解决方法: 1.使用windows验证登录 2.右键点击连接,点击属性,点击安全性,选择混合验证 3.重 ...
- 翻译 - ASP.NET Core 基本知识 - Web 主机 (Web Host)
翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/web-host?view=aspnetcore-5.0 ASP. ...
- JVM有哪些垃圾回收器
JVM 的垃圾回收器 目录 JVM 的垃圾回收器 经典垃圾收集器 Serial 收集器 ParNew 收集器 Parallel Scavenge 收集器 Serial Old 收集器 Parallel ...
- css animation @keyframes 动画
需求:语音播放动态效果 方案:使用如下图片,利用 css animation @keyframes 做动画 html <span class="horn" :class=& ...
- ESXI6.7主机降级至ESXI6.5
上一条博客vcenter添加主机失败:https://www.cnblogs.com/Crazy-Liu/p/11211760.html 原因esxi主机和vcenter版本不一致,因为vcenter ...