POJ-1087 A Plug for UNIX (网络流)
思路
电器数1 ~ 100,附带100种接口,注意题目:You notice that some of the devices use plugs for which there is no receptacle.
墙上接口1 ~ 100,还有1 ~ 100转接口,转接口有两个接口。假设所有的接口类型都不相同,接口就有400种。所以汇点值 >= 501。
读入电器的时候,它的接口可能在墙上并没有,所以要判断在此之前是否已经给该接口分配过标号。
读入转接口的时候,先读入两个转接口,然后分别判断是否已经分配过标号,最后在 转接口入口 -> 转接口出口 ,这两个接口之间建立一条INF的边。
#include <iostream>
#include <stdio.h>
#include <map>
#include <queue>
#include <string>
#include <string.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=110;
map<string,int>rec,dev;
int dev_cnt=1,rec_cnt=101;
int n,m,k;
struct Edge {
int to,cap,flow;
};
struct Dinic {
int cnt,s,t;
int head[6*maxn];
int deep[6*maxn];
int vis[6*maxn];
int cur[6*maxn];
int next[maxn*maxn*4];
Edge edge[maxn*maxn*4];
void addEdge(int u,int v,int w)
{
edge[cnt].to=v;
edge[cnt].cap=w;
edge[cnt].flow=0;
next[cnt]=head[u];
head[u]=cnt++;
edge[cnt].to=u;
edge[cnt].cap=0;
edge[cnt].flow=0;
next[cnt]=head[v];
head[v]=cnt++;
}
void init()
{
memset(head,-1,sizeof(head));
cnt=0;
s=0;
t=601;
}
bool bfs()
{
memset(vis,0,sizeof(vis));
memset(deep,0,sizeof(deep));
deep[s]=0;
vis[s]=1;
queue<int> q;
q.push(s);
while (!q.empty()) {
int u=q.front();
q.pop();
for (int i=head[u];i!=-1;i=next[i]) {
Edge &e=edge[i];
if (!vis[e.to]&&e.cap>e.flow) {
vis[e.to]=1;
deep[e.to]=deep[u]+1;
q.push(e.to);
}
}
}
return vis[t];
}
int dfs(int u,int in)
{
if (in==0||u==t) {
return in;
}
int f=0,out=0;
for (int &i=cur[u];i!=-1;i=next[i]) {
Edge &e=edge[i];
if (deep[e.to]==deep[u]+1&&(f=dfs(e.to,min(in,e.cap-e.flow)))>0) {
edge[i].flow+=f;
edge[i^1].flow-=f;
in-=f;
out+=f;
if (in==0) {
break;
}
}
}
return out;
}
int maxflow()
{
int ans=0;
while (bfs()) {
for (int i=0;i<6*maxn;i++) {
cur[i]=head[i];
}
ans+=dfs(s,INF);
}
return ans;
}
}DC;
int main()
{
DC.init();
cin>>n;
string tmp;
for (int i=0;i<n;i++) {
cin>>tmp;
rec[tmp]=rec_cnt;
DC.addEdge(rec_cnt,601,1);
rec_cnt++;
}
cin>>m;
for (int i=0;i<m;i++) {
cin>>tmp;
dev[tmp]=dev_cnt;
DC.addEdge(0,dev_cnt,1);
cin>>tmp;
if (rec[tmp]==0) {
rec[tmp]=rec_cnt++;
}
DC.addEdge(dev_cnt,rec[tmp],1);
dev_cnt++;
}
cin>>k;
string in,out;
for (int i=0;i<k;i++) {
cin>>in;
cin>>out;
if (rec[in]==0) {
rec[in]=rec_cnt++;
}
if (rec[out]==0) {
rec[out]=rec_cnt++;
}
DC.addEdge(rec[in],rec[out],INF);
}
printf("%d\n",dev_cnt-1-DC.maxflow());
return 0;
}
POJ-1087 A Plug for UNIX (网络流)的更多相关文章
- 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 / 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(字符串编号建图)
A Plug for UNIX Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14862 Accepted: 5026 ...
- kuangbin专题专题十一 网络流 POJ 1087 A Plug for UNIX
题目链接:https://vjudge.net/problem/POJ-1087 题目:有n个插座,插座上只有一个插孔,有m个用电器,每个用电器都有插头,它们的插头可以一样, 有k个插孔转化器, a ...
- 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 C - A Plug for UNIX 网络流最大流
C - A Plug for UNIXTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contes ...
- 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 ...
随机推荐
- Python入门3 —— 基本数据类型
一:为何变量值(记录的数据)要有类型呢? 1.既然可以记录事物的状态,为什么要分类型呢? 变量值是来记录事物状态的, 而事物的状态是多种多样的, 所以对应着就要应该用不同类型的值去记录这些状态. 二: ...
- NOIP做题练习(day2)
A - Reign 题面 题解 最大子段和+\(DP\). 预处理两个数组: \(p[i]\)表示 \(i\) 之前的最大子段和. \(l[i]\)表示 \(i\) 之后的最大子段和. 最后直接输出即 ...
- Java初识与配置环境
Java初识 Java简介 Java是一门面向对象的程序设计语言.功能强大并且简单易用,极好的实现了面向对象理论.允许程序以类似人类的思维方式进行复杂的编程. Java具有简单性.面向对象.分布式.健 ...
- JS table新增一行的时候 如何在新增的这一行把样式也加进去 例如变成<tr class="trd0">
JS table新增一行的时候 如何在新增的这一行把样式也加进去 例如变成<tr class="trd0">5 JS: var tab = document.get ...
- 转载:EQ--biquad filter
http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt https://arachnoid.com/BiQuadDesigner/index.html ...
- Hibernate知识点整理
一, Hibernate 介绍: Hibernate 只是一个将持久化类与数据库表相映射的工具,每个持久化类实例均对应于数据库表中的一个数据行而已.用户只需直接使用面向对象的方法操作此持久化类实例,即 ...
- java is 和 == ,以及equal
package string; public class MemAddrChange { public static void main(String[] args) { // const 常量区,
- DataTable 数据批量写入数据库三种方法比较
DataTable数据批量写入数据库三种方法比较 1) insert循环插入: 2) sqldataadapter.update(dataset,tablename); 3) sqlbul ...
- 将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法
本博客主要是说一下,,如何将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法. 1.先在阿里云上购买一台阿里云服务器(ECS云服务器): 2.远程连接上该服务器,在 ...
- 题解【洛谷P2853】[USACO06DEC]牛的野餐Cow Picnic
题目描述 The cows are having a picnic! Each of Farmer John's \(K (1 ≤ K ≤ 100)\) cows is grazing in one ...