网络流,关键在建图

建图思路在代码里

/*最大流SAP邻接表思路:基本源于FF方法,给每个顶点设定层次标号,和允许弧。优化:1、当前弧优化(重要)。1、每找到以条增广路回退到断点(常数优化)。2、层次出现断层,无法得到新流(重要)。时间复杂度(m*n^2)
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#define ms(a,b) memset(a,b,sizeof a)
using namespace std;
const int INF = 500;
struct node {int v, c, next;
} edge[INF*INF * 4];
int  pHead[INF*INF], SS, ST, nCnt;
void addEdge (int u, int v, int c) {edge[++nCnt].v = v; edge[nCnt].c = c, edge[nCnt].next = pHead[u]; pHead[u] = nCnt;edge[++nCnt].v = u; edge[nCnt].c = 0, edge[nCnt].next = pHead[v]; pHead[v] = nCnt;
}
int SAP (int pStart, int pEnd, int N) {int numh[INF], h[INF], curEdge[INF], pre[INF];int cur_flow, flow_ans = 0, u, neck, i, tmp;ms (h, 0); ms (numh, 0); ms (pre, -1);for (i = 0; i <= N; i++) curEdge[i] = pHead[i];numh[0] = N;u = pStart;while (h[pStart] <= N) {if (u == pEnd) {cur_flow = 1e9;for (i = pStart; i != pEnd; i = edge[curEdge[i]].v)if (cur_flow > edge[curEdge[i]].c) neck = i, cur_flow = edge[curEdge[i]].c;for (i = pStart; i != pEnd; i = edge[curEdge[i]].v) {tmp = curEdge[i];edge[tmp].c -= cur_flow, edge[tmp ^ 1].c += cur_flow;}flow_ans += cur_flow;u = neck;}for ( i = curEdge[u]; i != 0; i = edge[i].next)if (edge[i].c && h[u] == h[edge[i].v] + 1)     break;if (i != 0) {curEdge[u] = i, pre[edge[i].v] = u;u = edge[i].v;}else {if (0 == --numh[h[u]]) continue;curEdge[u] = pHead[u];for (tmp = N, i = pHead[u]; i != 0; i = edge[i].next)if (edge[i].c)  tmp = min (tmp, h[edge[i].v]);h[u] = tmp + 1;++numh[h[u]];if (u != pStart) u = pre[u];}}return flow_ans;
}
/*poj1087 最大流建图:每个种插座和为一个节点,添加源点和汇点源点到每个存在的插座连一条容量为插座数量的边统计需要每种插座的数量,作为插座到汇点边的容量如果有转换器A->B,AB连接一条容量无限的边
*/
int k, m, n, tol;
int sum[INF], need[INF];
map<string, int> mat;
string s,ss;
int main() {/*前向星存边,表头在pHead[],初始化nCnt=1SS,ST分别为源点和汇点*/nCnt = 1;cin >> n;for (int i = 1; i <= n; i++) {cin >> s;if (mat.find (s) == mat.end() ) mat[s] = ++tol;sum[tol]++;}cin >> m;for (int i = 1; i <= m; i++) {cin >> ss >> s;if (mat.find (s) == mat.end() ) mat[s] = ++tol;need[mat[s]]++;}cin>>k;for (int i=1;i<=k;i++){cin>>ss>>s;if (mat.find (s) == mat.end() ) mat[s] = ++tol;if (mat.find (ss) == mat.end() ) mat[ss] = ++tol;int u=mat[s],v=mat[ss];addEdge(u,v,100);}SS=tol+1,ST=tol+2;for(int i=1;i<=tol;i++){addEdge(SS,i,sum[i]);addEdge(i,ST,need[i]);}int ans=SAP(SS,ST,ST);cout<<m-ans<<endl;return 0;
}

View Code

转载于:https://www.cnblogs.com/keam37/p/3973660.html

poj 1087.A Plug for UNIX (最大流)相关推荐

  1. POJ - 1087 A Plug for UNIX(最大流)

    题目链接:点击查看 题目大意:给出n个互不相同的设备,m个插座以及k种适配器,每种适配器都有无限个,适配器可以互相搭配,问如何匹配可以让尽可能多的设备用上电 题目分析:裸的最大流,就是加上了个字符串把 ...

  2. POJ 1087 A Plug for UNIX 会议室插座问题 构图+最大流

    题目链接:POJ 1087 A Plug for UNIX A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  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(最大流,建图)(文末有极限数据)

    题目链接 Description You are in charge of setting up the press room for the inaugural meeting of the Uni ...

  5. poj 1087 A Plug for UNIX

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

  6. 解题报告 之 POJ1087 A Plug for UNIX

    解题报告 之 POJ1087 A Plug for UNIX Description You are in charge of setting up the press room for the in ...

  7. 【POJ - 1087】A Plug for UNIX(建图,网络流最大流)

    题干: You are in charge of setting up the press room for the inaugural meeting of the United Nations I ...

  8. POJ1087A Plug for UNIX(会议室的插座)——最大流

    http://poj.org/problem?id=1087 题目描述: 现在由你负责布置Internet 联合组织首席执行官就职新闻发布会的会议室. 由于会议室修建时被设计成容纳全世界各地的新闻记者 ...

  9. UVA 753 A Plug for UNIX (最大流)

    关键在建图,转换器连一条容量无限的边表示可以转化无数次,设备的插头连源点,插座连汇点. dinic手敲已熟练,输出格式又被坑,总结一下,输出空行多case的,一个换行是必要的,最后一个不加空行,有Te ...

  10. POJ 2112 Optimal Milking(二分+最大流)

    POJ 2112 Optimal Milking 题目链接 题意:给定一些机器和奶牛,在给定距离矩阵,(不在对角线上为0的值代表不可达),每一个机器能容纳m个奶牛.问全部奶牛都能挤上奶,那么走的距离最 ...

最新文章

  1. Linux用Openssl为Apache签发证书
  2. 基于朴素贝叶斯的垃圾邮件分类-着重理解拉普拉斯变换
  3. 排序算法 —— 快速排序
  4. 【渝粤教育】国家开放大学2018年秋季 0699-21T阅读与写作 参考试题
  5. 信息学奥赛一本通C++语言——1069:乘方计算
  6. arm-arago-linux-gnueabi 下载,arm-arago-linux-gnueabi问题
  7. ASP.NET网站SESSION丢失的问题
  8. 我的联想C467鲁大师检查配置
  9. Linkerd2安装和使用
  10. python怎么画小海龟_python画图之“小海龟”turtle
  11. java textarea滚动条,textarea添加滚动条 textarea 如何设置滚动条
  12. World Wind Java 系列
  13. Delphi名称的由来(原作:Borland公司Danny Thorpe)
  14. 看《赘婿》我不仅收获了快乐,还收获了独特的目标管理方法(OKRs-E)
  15. h264编码算法流程
  16. Sigil制作epub,正则表达式的使用
  17. 跨域读写Cookie
  18. 介绍几个预览效果不错的BIM网站链接
  19. Authorization头的作用
  20. Mybatis方法入参处理

热门文章

  1. udev文件系统的使用和基本工作原理分析
  2. 环境搭建:mobaxterm连接本地虚拟机
  3. UML设计中的箭头详解
  4. linux下数据同步、回写机制分析
  5. Linux signal 那些事儿 (3)
  6. Ubunt 12.04 中的QT中配置Tyin mini210 的交叉编译环境
  7. jquery radio设置选中_前端jQuery实战之 attr() 和 prop() 的区别
  8. hadoop Configured Configrable Configuration Tool 源码详解
  9. C++小游戏——小岛战争
  10. hdu4883-模拟---区间计数小技巧