链接:

http://poj.org/problem?id=1087

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#problem/C

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#problem/J(密码:0817)

n个插座,m个电器及其对应的插座,k个转化器,前一个插座可以转化为后一个插座,问最少有多少设备没有插座用,转换器数量不限
最大流,源点向插座建边,容量为1,电器向汇点建边,容量为1,相应的插座和电器连边,容量为1,前一个插座转化为后一个插座,
后一个插座向前一个插座建边,容量为无穷大,求得的最大流即为最多配对的电器。

网络流的部分是会了, 可是如何建图还是要学习

代码:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm> using namespace std; #define N 1005
#define INF 0xfffffff int G[N][N], Layer[N];
char s[N][]; bool CanLine(char s1[], char s2[]) ///判断转接口是否相同
{
if(strcmp(s1, s2)==)
return true;
return false;
} bool BFS(int Start, int End)
{
queue<int>Q;
Q.push(Start); memset(Layer, -, sizeof(Layer));
Layer[Start] = ; while(Q.size())
{
int u = Q.front();
Q.pop(); if(u==End) return true; for(int i=; i<=End; i++)
{
if(Layer[i]==- && G[u][i])
{
Layer[i] = Layer[u] + ;
Q.push(i);
}
}
}
return false;
}
int DFS(int u, int MaxFlow, int End)
{
if(u==End) return MaxFlow; int uflow = ; for(int i=; i<=End; i++)
{
if(G[u][i] && Layer[i]==Layer[u]+)
{
int flow = min(G[u][i], MaxFlow-uflow);
flow = DFS(i, flow, End); G[u][i] -= flow;
G[i][u] += flow;
uflow += flow; if(uflow == MaxFlow) break;
}
} return uflow;
}
int Dinic(int Start, int End)
{
int MaxFlow = ; while(BFS(Start, End))
MaxFlow += DFS(Start, INF, End); return MaxFlow;
} int main()
{
int n, m, k; while(scanf("%d", &n)!=EOF)
{
int i, j; memset(G, , sizeof(G)); for(i=; i<=n; i++) ///插头从1~n
scanf("%s", s[i]); scanf("%d", &m);
for(i=; i<=m; i++) ///手机从n~n+m, 忽略手机的名字
scanf("%*s%s", s[i+n]); scanf("%d", &k); ///Ki是转换头进入的开始点, Kj是转换头出去的开始点, Start是源点,End是汇点
int Ki = n+m, Kj = Ki+k, Start = Kj+k+, End = Start+;
for(i=; i<=k; i++) ///转换器的进入n+m~n+m+k, 转换器的出从n+m+k~n+m+2*k
{
///把入和出连接
scanf("%s%s", s[Ki+i], s[Kj+i]);
G[Ki+i][Kj+i] = INF; ///转换器无限提供
} for(i=; i<=m; i++) ///建立手机和转换器,插座的关系
{
for(j=; j<=n; j++) ///匹配一下手机和插座是否直接可以相连
if(CanLine(s[i+n], s[j]))
G[i+n][j]=true; for(j=; j<=k; j++) ///匹配一下手机和转换器入是否可以相连
if(CanLine(s[i+n], s[Ki+j]))
G[i+n][Ki+j]=true;
} for(i=; i<=k; i++) ///建立转换器与转换器,插座的关系
{
for(j=; j<=k; j++) /// 匹配转换器与转换器入,转换器无限提供, 直接最大值
if(i!=j && CanLine(s[Kj+i], s[Ki+j]))
G[Kj+i][Ki+j] = INF; for(j=; j<=n; j++) /// 匹配转换器出和插座的关系
if(CanLine(s[Kj+i], s[j])==true)
G[Kj+i][j] = true;
} for(i=; i<=m; i++) ///源点与手机的关系
G[Start][n+i] = true; for(i=; i<=n; i++) ///插座与汇点的关系
G[i][End] = true; printf("%d\n", m-Dinic(Start, End));
} return ;
}

(网络流 模板)A Plug for UNIX -- poj -- 1087的更多相关文章

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

  2. A Plug for UNIX POJ - 1087(模板题 没啥好说的。。就用了一个map)

    题意: 几种插头,每一种都只有一个,但有无限个插头转换器,转换器(a,b) 意味着 可以把b转换为a,有几个设备,每个设备对应一种插头,求所不能匹配插头的设备数量 这个题可以用二分图做 , 我用的是最 ...

  3. C - A Plug for UNIX - poj 1087(最大流)

    题目大意:这个题意有些蛋疼,看了很大会才明白什么意思,有N个插座,这些插座都是有类型的只能给这种类型的电器充电,下面接着给了M种电器,和电器的插头类型,还有K种转换器,可以把一种类型转换成另一种,转换 ...

  4. (网络流 模板 Edmonds-Karp)Drainage Ditches --POJ --1273

    链接: http://poj.org/problem?id=1273 Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total ...

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

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

  7. poj 1087 A Plug for UNIX(字符串编号建图)

    A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14862   Accepted: 5026 ...

  8. Power Network POJ - 1459 [网络流模板]

    http://poj.org/problem?id=1459 嗯,网络流模板...多源点多汇点的图,超级汇点连发电厂,用户连接超级汇点 Status Accepted Time 391ms Memor ...

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

随机推荐

  1. Vote Disk 和 OCR概述

    Oracle Clusterware由2部分组成,分别是Voting Disk和 OCR. Voting Disk里面记录着节点成员的信息. 如RAC数据库中有哪些节点成员,节点增加或者删除时也同样会 ...

  2. CentOS7系列搭建Openvpn

    环境:CentOS Linux release 7.3.1611 (Core) 查看os版本命令:[root@openvpn ~]# cat /etc/redhat-release 命令记录如下: y ...

  3. VS文件发布不了,这样设置可以解决

    在VS里面新增一些文件的时候,往往发布的时候会发布不了,比如:(*.rdlc,*.p12).在项目里面,这些项目已经包含在项目里了,但是发布后,会发现这些文件并没有被发布出来 解决办法:邮件选择文件, ...

  4. 获取RequestMapping注解中的属性

    参考:https://www.cnblogs.com/2013jiutian/p/7294053.html @RequestMapping("/value1") @Controll ...

  5. 【校招面试 之 C/C++】第6题 C++深拷贝与浅拷贝

    1.两个的区别(1)在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制.当数据成员中没有指针时,浅拷贝是可行的: 但当数据成员中有指针时,如果采用简单的浅 ...

  6. IIS 访问不了,IIS有问题,IIS右击浏览没反应

    查看是否是下面的问题 web服务扩展中,下面三项设置为 “允许”  CGI扩展  ISAPI扩展  Active Server Pages

  7. [leetcode]158. Read N Characters Given Read4 II - Call multiple times 用Read4读取N个字符2 - 调用多次

    The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...

  8. C#调用默认浏览器打开网页的几种方法

    private void button1_Click(object sender, EventArgs e) { //从注册表中读取默认浏览器可执行文件路径 RegistryKey key = Reg ...

  9. 对于某些浏览器不支持placeholder的解决办法

    $(function () { if (!placeholderSupport()) { $('[placeholder]').focus(function () { var input = $(th ...

  10. canvas学习持续更新

    参考:菜鸟教程,canvas教程 绘制一个简单的矩形 <body> <canvas id="myCanvas" width="200" hei ...