链接:

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. Git reset head revert 回滚

    Overview 涉及Git一些日常操作 :) 基础知识 <Pro Git>至少了解branch,commit的概念,及基本的原理 Git常用魔法 存档:master代码回滚方法 我是QA ...

  3. 实现Action的三种方式

    实现Action的三种方式: 1.普通类  一般采用此种方法 2.实现Action接口 3.继承ActionSupport类

  4. python引入模块时import与from ... import的区别(转)

    import datetime是引入整个datetime包,如果使用datetime包中的datetime类,需要加上模块名的限定. 1 import datetime 2 3 print datet ...

  5. 【Java】JVM(三)、Java垃圾收集器

    一.Minor GC.Major GC 和 Full GC Minor GC:清理新生代空间,当Eden空间不能分配时候引发Minor GC Major GC:清理老年代空间 Full GC:清理Ja ...

  6. 全排列12 · Permutations

    无重复 [抄题]: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have ...

  7. Nginx 分析access日志文件

    Nginx Access Log日志统计分析常用命令 IP相关统计 统计IP访问量 awk '{print $1}' access.log | sort -n | uniq | wc -l 查看某一时 ...

  8. instanceof用法及本质:

    import static java.lang.System.*; public class InstanceofTest{ public static void main(String[] args ...

  9. PAT 1074 宇宙无敌加法器(20)(代码+思路+测试点分析)

    1074 宇宙无敌加法器(20 分)提问 地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的.而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为"P ...

  10. 那些你不知道的PS大片摄影

    你以为这张照片是P出来的? 才不是! 人家是开个起重机吊着拍的! 而且没有任何保护措施! 这样的照片战斗民族的摄影师才敢这样拍…要是在天朝这么做估计都找不到模特… 这张照片出自乌兹别克斯坦的摄影师Ra ...