poj1087 A Plug for UNIX(网络流最大流)
http://poj.org/problem?id=1087
好久没遇见过这么坑的题了这个题真是挫的够可以的。题目大意:你作为某高管去住宿了,然后宾馆里有几种插座,分别有其对应型号,你携带了几种用电器(手机,电脑一类的),
也有其对应型号;可是不一定用电器就能和插座匹配上,于是宾馆的商店里提供了一些转换器,这些转换器可以将某一型号电源转换成另一型号的。问,你的用电器最少会有多少种无
法充电。也就是问可以用上电的用电器的最大数目,之后用电器总数减去此可用电最大数目即可得到最小不能用电数目。
一开始以为直接将插座,转换器,用电器匹配后跑个最大流模板就行,后来发现想的太简单了。
分析:
1:用电器可直接连插座;
2:用电器可以连接转换器再连接上插座;
3:转换器之间可以相互连接;
4:转换器转换作用是双向的,比如给定转换器可对A和B进行转换,则此转换器可以将A转换成B,也可以将B转换成A;
5:每种转换器的数目是无限的;
6:一个插座只能连接产生一个出处。
7:虚拟一个源点一个汇点即可,源点到插座和插头到汇点的流量为1。
按照这些建图失误了四次之后终于成功A过了。
附加详细建图步骤的备注的AC代码和一组测试数据(测试答案应当为0)
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
#define oo 0x3f3f3f3f
int G[][], n, m, p, vis[];
char receptacle[][];
char plug[][];
struct ad
{
char in[], out[];
}adapter[]; bool bfs(int Start, int End)
{
memset(vis, , sizeof(vis));
vis[Start] = ; queue<int>Q;
Q.push(Start); while(Q.size())
{
int now = Q.front();
Q.pop(); if(now == End)
return true; for(int i=; i<=End; i++)
{
if(!vis[i] && G[now][i]>)
{
vis[i] = vis[now] + ;
Q.push(i);
}
}
} return false;
} int dfs(int Start, int End, int Maxflow)
{
if(Start == End)
return Maxflow; int nowflow = ; for(int i=; i<=End; i++)
{
if(vis[i] == vis[Start] + && G[Start][i]>)
{
int flow = min(G[Start][i], Maxflow - nowflow); flow = dfs(i, End, flow); G[Start][i] -= flow;
G[i][Start] += flow; nowflow += flow; if(nowflow == Maxflow)
break;
}
} return nowflow;
}
int dinic(int Start, int End)
{
int ans = , s; while(bfs(Start, End))
{
s = dfs(Start, End, oo);
if(!s)break;
ans += s;
} return ans;
}
int main()
{
while(~scanf("%d", &n))
{
memset(G, , sizeof(G)); for(int i=; i<=n; i++)
scanf("%s", receptacle[i]); scanf("%d", &m);
for(int i=; i<=m; i++)
{
scanf("%*s %s", plug[i]);
for(int j=; j<=n; j++)
{
if(strcmp(receptacle[j], plug[i]) == )///插头和插座可直接连
{
G[j][n+p+i] = ;
}
}
} scanf("%d", &p);
for(int i=; i<=p; i++)
scanf("%s %s", adapter[i].in, adapter[i].out); for(int i=; i<=p; i++)///1~n是插座,n+1~n+p是转换器,n+p+1~n+p+m是插头
{
for(int j=; j<=n; j++)
{
if(strcmp(receptacle[j], adapter[i].in)== || strcmp(receptacle[j], adapter[i].out)==)///插座和转换器匹配
{
G[j][n+i] = ;
}
} for(int j=; j<=m; j++)
{
if(strcmp(plug[j], adapter[i].out)== || strcmp(plug[j], adapter[i].in)==)///转换器和插头匹配
{
G[n+i][n+p+j] = ;
}
}
} for(int i=; i<=p; i++)///转换器之间相连
{
for(int j=; j<=p; j++)
{
if(i!=j && strcmp(adapter[i].in, adapter[j].out)==)
G[n+i][n+j] = oo;
}
for(int j=; j<=p; j++)
{
if(i!=j && strcmp(adapter[i].out, adapter[j].in)==)
G[n+i][n+j] = oo;
}
} int Start = n+p+m+, End = Start+; for(int i=; i<=n; i++)///源点和插座相连
{
G[Start][i] = ;
} for(int i=; i<=m; i++)///插头和汇点相连
{
G[n+p+i][End] = ;
} printf("%d\n", m - dinic(Start, End));
}
return ;
} /*
16
A
D
X
A
D
A
D
X
D
A
D
D
X
D
X
D
14
CLOCK B
CLOCK B
CLOCK B
LAPTOP B
LAPTOP B
LAPTOP B
LAPTOP B
LAPTOP B
LAPTOP B
PAGER B
PAGER B
COMB X
CELL C
CELL C
4
C D
X D
B X
B A
*/
poj1087 A Plug for UNIX(网络流最大流)的更多相关文章
- 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 ...
- 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. 可转换插头相连,容 ...
- 【uva753/poj1087/hdu1526-A Plug for UNIX】最大流
题意:给定n个插座,m个插头,k个转换器(x,y),转换器可以让插头x转成插头y.问最少有多少个插头被剩下. 题解: 最大流或者二分图匹配.然而我不知道怎么打二分图匹配..打了最大流.这题字符串比较坑 ...
- 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 题目链接:https://vjudge.net/problem/POJ-1087 Description: You are in charge of setting u ...
- POJ1087 A Plug for UNIX(网络流)
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total S ...
- 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 ...
随机推荐
- (转)You might not need jQuery
You might not need jQuery You certainly can support IE 9 and below without jQuery, but we don't. Ple ...
- Linux系统下如何查看已经登录用户
查看用户的操作 系统管理员若想知道某一时刻用户的行为,只需要输入命令W 即可,在SHELL终端中输入如下命令: [ROOT@LOCALHOST ROOT] # W 2:31PM UP 11 DAY , ...
- 《疯狂Java讲义》(四)---- 面向对象&基于对象
"基于对象"也使用了对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说,"基于对象"没有继承的特点,而多态更需要继承,所以" ...
- LR12.53—第3课:重播Vuser脚本
第3课:重播Vuser脚本 在前面的教训,你记录了一组典型的用户行为,并准备重播脚本. 重播脚本之前,您可以配置脚本的运行时设置,它定义了Vuser的行为. 注:记录与基于Web的协议的地方WebTo ...
- strcpy和memcpy的区别(转载)
strcpy和memcpy都是标准C库函数,它们有下面的特点.strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy函 ...
- 用rpm -e 将yum命令删除了,如何修复
系统环境: 物理机:Windows 10 家庭中文版 虚拟机:VMware Workstation 10 Linux发行版本:CentOS 6.5 相关信息查询: 首先查询,系统安装的yum包的信息: ...
- Spring使用非applicationContext.xm 默认名的配置文件的配置
Spring默认的配置文件是applicationContext.xml,但是有些时候,希望拆分Spring的配置文件,让其单一化,每一个都只进行自己的配置,如图所示 那么就需要在web.xml中配置 ...
- NHibernate系列文章目录
第一章:NHibernate基础 NHibernate介绍 第一个NHibernate工程 简单的增删改查询 运行时监控 NHibernate配置 数据类型映射 Get/Load方法 NHiberna ...
- Mybatis 新增修改一条SQL
如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE:如果不会导致唯一值 ...
- mysql 导出csv
SELECT order_id,product_name,qty FROM ordersINTO OUTFILE '/tmp/orders.csv'FIELDS TERMINATED BY ','EN ...