题目链接: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的更多相关文章

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

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

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

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

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

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

  5. poj 1087 A Plug for UNIX

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

  6. 【poj 1087 a plug for UNIX】

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

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

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

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

  9. (网络流 模板)A Plug for UNIX -- poj -- 1087

    链接: http://poj.org/problem?id=1087 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#probl ...

随机推荐

  1. Android studio 使用git仓库记录

    studio 绑定git settings --> verson control -->git 在项目文件目录右击打开git bash here操作界面 查看git项目安装位置 找到id_ ...

  2. wpf 自定义 ToolTip 模板

    示例是在blend中画的,圆角带阴影和倒三角 <Style x:Key="toolTipStyle" TargetType="ToolTip"> & ...

  3. com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1680 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.

    这个错误是由于mysql的一个系统参数max_allowed_packet设置的值过小引起的 解决这个错误的方法就是修改这个参数的值, linux系统中我们在etc目录下找到my.cnf这个文件,打开 ...

  4. 关于SAM和广义SAM

    关于SAM和广义SAM 不是教程 某些思考先记下来 SAM 终于学会了这个东西诶...... 一部分重要性质 确定一个重要事情,S构造出的SAM的一个重要性质是当且仅当对于S的任意一个后缀,可以从1号 ...

  5. 【题解】P4841 城市规划(指数型母函数+多项式Ln)

    [题解]P4841 城市规划 P4841 城市规划 超级弱化版本(DP):POJ - 1737 两张图不同当且仅当边的分布不一样的时候,带编号最后乘一个阶乘即可,现在最主要的问题就是"联通& ...

  6. ng-zorro-antd中踩过的坑

    ng-zorro-antd中踩过的坑 前端项目中,我们经常会使用阿里开源的组件库:ant-design,其提供的组件已经足以满足多数的需求,拿来就能直接用,十分方便,当然了,有些公司会对组件库进行二次 ...

  7. 突破CRUD | 简单优雅的代码生成工具诞生记(万字长文慎入)

    0.学习本文你或许可以收获 1.一个需求从产生.分析到解决的全过程思考2.简单的面向对象分析实践3.UML类图实践4.设计模式的实践应用5.最后收获一款还算不错的代码生成工具实现思路和源代码 本文将从 ...

  8. schedule of 2016-10-09~2016-10-16(Sunday~Sunday)——1st semester of 2nd Grade

    most important things to do 1.prepare for toefl 2.joint phd preparations 3.ieee trans thesis to writ ...

  9. C#反射与特性(六):设计一个仿ASP.NETCore依赖注入Web

    目录 1,编写依赖注入框架 1.1 路由索引 1.2 依赖实例化 1.3 实例化类型.依赖注入.调用方法 2,编写控制器和参数类型 2.1 编写类型 2.2 实现控制器 3,实现低配山寨 ASP.NE ...

  10. python线性数据结构

    1.栈(Stack)(后进先出) 栈的实现: class Stack: def __init__(self): self.items = [] def isEmpty(self): return se ...