kuangbin专题专题十一 网络流 POJ 1087 A Plug for UNIX
题目链接:https://vjudge.net/problem/POJ-1087
题目:有n个插座,插座上只有一个插孔,有m个用电器,每个用电器都有插头,它们的插头可以一样,
有k个插孔转化器, a b 的意思就是 可以把 b类的插孔变成a类的插孔,那么a类对于的插头就可以用这个插孔充电了。
问:没插孔的用电器最少有几个。
思路:源点->插座->用电器->汇点。
因为插座之间可以相互转化,可能A,B,C,D都可以变成E类的插座,所以插座之间的流应该为INF,其他的边流都是1,起到限流的作用。
编号比较麻烦,可以用map进行标记,编号。
这里N = 1100 ,之前写的代码N = 410,wa了 然后我N = 1100的过了之后,wa的代码直接复制提交到POJ居然过了。。。我是蒙蔽的,很无奈。
#include <iostream>
#include <cstdio>
#include <map>
#include <string>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std; const int N = ,INF = (int)1e9;
int id,tot,s,t,all;
int head[N],lev[N],cur[N];
map<string,int > mp;
vector<string > ve[];
queue<int > que;
struct node{
int to,nxt,flow;
}e[N*N]; inline void add(int u,int v,int flow){
e[tot].to = v;
e[tot].flow = flow;
e[tot].nxt = head[u];
head[u] = tot++;
e[tot].to = u;
e[tot].flow = ;
e[tot].nxt = head[v];
head[v] = tot++;
} inline bool ID(char* name){
if(mp.count(name)) return true;
else return false;
} void build_map(){
for(int i = ; i <= ; ++i) head[i] = -; tot = ;
int n,m,k;
char name1[],name2[];
scanf("%d",&n); for(int i = ; i <= n; ++i){
scanf("%s",name1);
if(!ID(name1)) mp[name1] = ++id;
ve[].push_back(name1);
}
//插座到用电器
scanf("%d",&m); all = m;
for(int i = ; i <= m; ++i){
scanf("%s%s",name1,name2);
if(!ID(name1)) mp[name1] = ++id;
if(!ID(name2)) mp[name2] = ++id;
add(mp[name2],mp[name1],);
ve[].push_back(name1);
}
//插座之间
scanf("%d",&k);
for(int i = ; i <= k; ++i){
scanf("%s%s",name1,name2);
if(!ID(name1)) mp[name1] = ++id;
if(!ID(name2)) mp[name2] = ++id;
add(mp[name2],mp[name1],INF);
}
//源点到插座
s = , t = ++id;
int num[] = {ve[].size(), ve[].size()};
for(int i = ; i < num[]; ++i){
add(s,mp[ve[][i]],);
}
//用电器到汇点
for(int i = ; i < num[]; ++i){
add(mp[ve[][i]],t,);
}
} void show(){
cout << "id ====== " << id << endl;
for(int i = ; i <= id; ++i){
printf("当前点为 %d 相关联的点:",i);
for(int o = head[i]; ~o; o = e[o].nxt){
printf("%d 流量为 %d ",e[o].to,e[o].flow);
}cout << endl;
}
} bool bfs(int s,int t){
for(int i = s; i <= t; ++i) lev[i] = ;
while(!que.empty()) que.pop();
lev[s] = ;
que.push(s);
while(!que.empty()){
int u = que.front(); que.pop();
for(int o = head[u]; ~o; o = e[o].nxt){
int v = e[o].to;
if(!lev[v] && e[o].flow){
lev[v] = lev[u] + ;
if(v == t) return true;
que.push(v);
}
}
}
return false;
} int dfs(int now,int flow,int t){
if(now == t) return flow;
int sum = ,tmp;
for(int o = cur[now]; ~o; o = e[o].nxt){
int to = e[o].to;
if((lev[to] == lev[now] +) && e[o].flow && (tmp = dfs(to,min(flow-sum,e[o].flow),t))){
e[o].flow -= tmp;
e[o^].flow += tmp;
if((sum += tmp) == flow) return sum;
}
}
return sum;
} int mf(int s,int t){
int _mf = ;
while(bfs(s,t)){
for(int i = s; i <= t; ++i) cur[i] = head[i];
_mf += dfs(s,INF,t);
}
return _mf;
} int main(){ build_map();
// show();
int _mf = mf(s,t);
printf("%d\n",all -_mf); return ;
}
kuangbin专题专题十一 网络流 POJ 1087 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 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 ...
- 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 ...
- poj 1087 A Plug for UNIX 【最大流】
题目连接:http://poj.org/problem? id=1087 题意: n种插座 ,m个电器,f组(x,y)表示插座x能够替换插座y,问你最多能给几个电器充电. 解法:起点向插座建边,容量1 ...
- poj 1087.A Plug for UNIX (最大流)
网络流,关键在建图 建图思路在代码里 /* 最大流SAP 邻接表 思路:基本源于FF方法,给每个顶点设定层次标号,和允许弧. 优化: 1.当前弧优化(重要). 1.每找到以条增广路回退到断点(常数优化 ...
- poj 1087 A Plug for UNIX
题目描述:现在由你负责布置Internet联合组织首席执行官就职新闻发布会的会议室.由于会议室修建时被设计成容纳全世界各地的新闻记者,因此会议室提供了多种电源插座用以满足(会议室修建时期)各国不同插头 ...
- 【poj 1087 a plug for UNIX】
在大米饼的帮助下,终于找到了大米饼程序中如同大米饼一般的错误! 考点在问题转化,然后就跑一个你喜欢的最大流算法(二分图可以啵?) 再来一个例子吧: [纯手绘大米饼图片] 其中有的边权是1,否则就是in ...
- poj 1087 A Plug for UNIX(字符串编号建图)
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14862 Accepted: 5026 ...
- kuangbin专题专题十一 网络流 POJ 3436 ACM Computer Factory
题目链接:https://vjudge.net/problem/POJ-3436 Sample input 1 3 4 15 0 0 0 0 1 0 10 0 0 0 0 1 1 30 0 1 2 1 ...
- (网络流 模板)A Plug for UNIX -- poj -- 1087
链接: http://poj.org/problem?id=1087 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#probl ...
随机推荐
- codeforces 161D 点分治
传送门:https://codeforces.com/problemset/problem/161/D 题意: 求树上点对距离恰好为k的点对个数 题解: 与poj1741相似 把点分治的模板改一下即可 ...
- 使用Squid做代理服务器,Squid单网卡透明代理配置详解(转)
使用Squid做代理服务器 说到代理服务器,我们最先想到的可能是一些专门的代理服务器网站,某些情况下,通过它们能加快访问互联网的速度.其实,在需要访问外部的局域网中,我们自己就能设置代理,把访问次数较 ...
- 第二阶段:2.商业需求文档MRD:5.MRD-Roadmap及规划
产品路线图可以用泳道图来实现.将之前做过的泳道图的角色换为阶段即可. 可以以月为单位.左边就是一些产品的功能. 基础功能,有的功能会跨月甚至夸功能模块.比如图中的会员等级. 通过线段来联系各个功能与先 ...
- ArrayList、LinkedList、Vector、CopyOnWriteArrayList的区别和源码分析
1. ArrayList ArrayList 是一个数组队列,相当于动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, ...
- ArrayList数组扩容方式(基于jdk1.8)
ArrayList无参构造函数为: public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } 而DEFA ...
- centos安装pip,zipimport.ZipImportError报错
安装pip下载pip安装包wget https://bootstrap.pypa.io/get-pip.py 执行以下报错 python get-pip.py ##报错内容(zipimport.Zip ...
- DNS服务器红帽5.4搭建图文教程!!!
DNS服务器 挂载光盘 mount 查看光盘所在位置 mount -t iso9660 设备目录 /mnt 表示挂载 软件包安装 所有软件包都在Server目录下 rpm -ivh /mnt/Serv ...
- 阿里云函数计算 .NET Core 初体验
体验了一波阿里云函数计算, 已支持 .NET Core 2.1, 那么按照惯例, 来写个 "Hello World" 吧. 作者注: 开发环境 Windows 10 & V ...
- 小小知识点(十五)——origin pro 2018 安装和消除demo字样
安装 1.安装过成中选择语言为中文或者英文,安装完成后可在注册表中切换语言. 2.安装过程中使用序列号 中文版:DF2W8-9089-7991320英文版:GF3S4-9089-7991320 3.安 ...
- placeHolder和defaultValue的区别
placeHolder和defaultValue的区别 (1)placeHolder用于提示用户,它不与后端进行交互. (2)defaultValue则是与后端交互时的默认值. 举例说明:在Selec ...