链接:

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. How to Pronounce the Word SOMETHING

    How to Pronounce the Word SOMETHING Share Tweet Share Something tells me you’re going to like this v ...

  2. Linux终极渗透测试命令总结

    本文主要和大家分享Linux终极渗透测试命令总结,如下是一份 Linux 机器的渗透测试备忘录,是在后期开发期间或者执行命令注入等操作时的一些典型命令,设计为测试人员进行本地枚举检查之用. 命令 描述 ...

  3. mysql基本的修改表的命令

    修改表相关的命令 1.添加列表 alter table 表名 add 列名 类型; 2.删除某一列 alter table userinfo drop column 列名; 3.修改列的类型 alte ...

  4. 把System.Drawing.Image对象img,在页面的Image控件上显示出来

    1.保存到本地,然后调用. //定义文件名    string iname = DateTime.Now.ToString("yyMMddhhmmss"); //保存到服务器,b是 ...

  5. repeater嵌套RadioButtonList赋值

    <asp:Repeater ID="Repeater1" runat="server"         onitemdatabound="Rep ...

  6. Maven核心简析

    本文以类图的方式,介绍maven核心的12个概念以及相互之间的关系. Table of Contents 1 maven管理的目标:工程(Project) 1.1 工程依赖关系 1.2 工程聚合关系 ...

  7. js Array Map and Set

    Array slice slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array: var arr = ['A', 'B', 'C', ' ...

  8. laravel中的old()函数

    1.控制器 2.模板

  9. Spring.NET学习笔记8——集合类型的注入(基础篇)

    1.基础类 public class Happy    {        public override string ToString()        {            return &q ...

  10. 1.spring环境的搭建

    1.app.config <?xml version="1.0" encoding="utf-8" ?><configuration> ...