链接:http://poj.org/problem?

id=1087

题意:提供n种插座。每种插座仅仅有一个,有m个设备须要使用插座,告诉你设备名称以及使用的插座类型,有k种转换器。能够把某种插座类型转为还有一种,能够嵌套使用。比方有设备需使用第4种插座,如今仅仅有第一种插座,可是有两个转换器,1→3和3→4,则通过这两个转换器设备能够充电。每种转换器有无数个。现告诉你对应信息,求至少有多少个设备无法使用插座。

网络最大流单源点单汇点。是一道基础题,图建好就能套模板了。

关键是图怎么建。

还是自己设一个源点和一个汇点。源点出发到每种设备各有一条路径容量为1,如今已有的插座种类到汇点各有一条路径容量为1。反过来也行,最大流的值不会由于这个而改变。每种设备各有一个须要使用的插座类型。把这些设备和各自须要的插座连一条路径,容量为1。对于转换器,假设把a转为b,就在a和b之间连一条路径,容量为正无穷,图就建好了。

假设说的不够清楚。看了这个图也能一目了然。这是依据题目例子建的图:

#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 50100
#define eps 1e-7
#define INF 0x7FFFFFFF
#define seed 131
#define mod 1000000007
#define ll long long
#define ull unsigned ll
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 struct node{
int u,w,next;
}edge[10100];
int head[210],vis[210],dist[210];
int n,m,k,src,sink,cnt;
int num1,num2;
map<string,int>mp;
void add_edge(int a,int b,int c){
edge[cnt].u = b;
edge[cnt].w = c;
edge[cnt].next = head[a];
head[a] = cnt++;
}
void bfs(){
int i,j;
memset(dist,0,sizeof(dist));
queue<int>q;
vis[src] = 1;
q.push(src);
while(!q.empty()){
int tt = q.front();
q.pop();
for(i=head[tt];i!=-1;i=edge[i].next){
if(!vis[edge[i].u]&&edge[i].w){
dist[edge[i].u] = dist[tt] + 1;
vis[edge[i].u] = 1;
q.push(edge[i].u);
}
}
}
}
int dfs(int u,int delta){
int i,j;
if(u==sink) return delta;
int ret = 0;
for(i=head[u];i!=-1;i=edge[i].next){
if(edge[i].w&&dist[edge[i].u]==dist[u]+1){
int dd = dfs(edge[i].u,min(delta,edge[i].w));
edge[i].w -= dd;
edge[i^1].w += dd;
delta -= dd;
ret += dd;
}
}
return ret;
}
int maxflow(){
int ret = 0;
while(1){
memset(vis,0,sizeof(vis));
bfs();
if(vis[sink]==0) break;
ret += dfs(src,INF);
}
return ret;
}
int main(){
int i,j;
string str1,str2;
memset(head,-1,sizeof(head));
num1 = 1;
num2 = 101;
cnt = 0;
src = 0;
sink = 205;
scanf("%d",&n);
for(i=0;i<n;i++){
cin>>str1;
mp[str1] = num1++;
add_edge(mp[str1],sink,1);
add_edge(sink,mp[str1],0);
}
scanf("%d",&m);
for(i=0;i<m;i++){
cin>>str1>>str2;
mp[str1] = num2++;
if(!mp[str2]) mp[str2] = num1++;
add_edge(mp[str1],mp[str2],1);
add_edge(mp[str2],mp[str1],0);
add_edge(src,mp[str1],1);
add_edge(mp[str1],src,0);
}
scanf("%d",&k);
for(i=0;i<k;i++){
cin>>str1>>str2;
add_edge(mp[str1],mp[str2],INF);
add_edge(mp[str2],mp[str1],0);
}
int ans = maxflow();
printf("%d\n",m-ans);
return 0;
}

POJ--1087--A Plug for UNIX【Dinic】网络最大流的更多相关文章

  1. POJ 1087 A Plug for UNIX (网络流,最大流)

    题面 You are in charge of setting up the press room for the inaugural meeting of the United Nations In ...

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

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

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

  4. poj 1087 A Plug for UNIX 【最大流】

    题目连接:http://poj.org/problem? id=1087 题意: n种插座 ,m个电器,f组(x,y)表示插座x能够替换插座y,问你最多能给几个电器充电. 解法:起点向插座建边,容量1 ...

  5. poj 1087 A Plug for UNIX

    题目描述:现在由你负责布置Internet联合组织首席执行官就职新闻发布会的会议室.由于会议室修建时被设计成容纳全世界各地的新闻记者,因此会议室提供了多种电源插座用以满足(会议室修建时期)各国不同插头 ...

  6. kuangbin专题专题十一 网络流 POJ 1087 A Plug for UNIX

    题目链接:https://vjudge.net/problem/POJ-1087 题目:有n个插座,插座上只有一个插孔,有m个用电器,每个用电器都有插头,它们的插头可以一样, 有k个插孔转化器, a ...

  7. poj 1087.A Plug for UNIX (最大流)

    网络流,关键在建图 建图思路在代码里 /* 最大流SAP 邻接表 思路:基本源于FF方法,给每个顶点设定层次标号,和允许弧. 优化: 1.当前弧优化(重要). 1.每找到以条增广路回退到断点(常数优化 ...

  8. 【poj 1087 a plug for UNIX】

    在大米饼的帮助下,终于找到了大米饼程序中如同大米饼一般的错误! 考点在问题转化,然后就跑一个你喜欢的最大流算法(二分图可以啵?) 再来一个例子吧: [纯手绘大米饼图片] 其中有的边权是1,否则就是in ...

  9. 算法模板——Dinic网络最大流 2

    实现功能:同Dinic网络最大流 1 这个新的想法源于Dinic费用流算法... 在费用流算法里面,每次处理一条最短路,是通过spfa的过程中就记录下来,然后顺藤摸瓜处理一路 于是在这个里面我的最大流 ...

  10. 算法模板——Dinic网络最大流 1

    实现功能:同sap网络最大流 今天第一次学Dinic,感觉最大的特点就是——相当的白话,相当的容易懂,而且丝毫不影响复杂度,顶多也就是代码长个几行 主要原理就是每次用spfa以O(n)的时间复杂度预处 ...

随机推荐

  1. 一个简单的演示用的Linux字符设备驱动程序

    实现如下的功能:--字符设备驱动程序的结构及驱动程序需要实现的系统调用--可以使用cat命令或者自编的readtest命令读出"设备"里的内容--以8139网卡为例,演示了I/O端 ...

  2. Php learn note

    Php learn note 1. Between two part of ECHO, there is , sign rather than + sign. echo 'Hello World!!' ...

  3. 基本的Mysql语句

    操作文件夹(库) 增 create database db1 charset utf8; 查 # 查看当前创建的数据库 show create database db1; # 查看所有的数据库 sho ...

  4. Solr.NET快速入门(三)【高亮显示】

    此功能会"高亮显示"匹配查询的字词(通常使用标记),包括匹配字词周围的文字片段. 要启用高亮显示,请包括HighlightingParameters QueryOptions对象, ...

  5. Hadoop系列之实验环境搭建

    实验环境基本配置 硬件:硬盘单节点50GB,1G内存,单核. 操作系统:CentOS6.4 64bit Hadoop:2.20 64bit(已编译) JDK:jdk1.7 磁盘分区: / 5GB /b ...

  6. Surround the Trees[HDU1392]

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. JavaScript数组和json的区别

    <html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...

  8. Android 用Handler和Message实现计时效果及其中一些疑问

    本来是打算继续做天气预报的优化的,但因为某些原因,我要先把之前做的小应用优化一下.所以今天就插播一下用Handler和Message实现计时效果. 首先,简要说明一下,这个应用有两个显示数字的Text ...

  9. 11.javaweb国际化标签库

    一.国际化标签库 1,格式化标签库提供的标签 2,标签详解 2.1<fmt:setLocale>标签 下面设置不同的区域,并在设置的区域下显示日期 2.2<fmt:requestEn ...

  10. 基于MapReduce的贝叶斯网络算法研究参考文献

    原文链接(系列):http://blog.csdn.net/XuanZuoNuo/article/details/10472219 论文: 加速贝叶斯网络:Accelerating Bayesian ...