POJ1459-Power Network

转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1299339754

 

提示:BFS找增广链 + 压入重标法

解题思路:

多源多汇最大流问题

 

题目给出很多都是废话,特别是符号s(u)d(u)Con还有那条公式都别管,混淆视听

难点在于构图

 

电站p(u)均为源点,用户c(u)均为汇点,中转站当普通点处理

 

第一个误区是例图, 结点 都有x/y(流量和容量),这个很容易使人产生矛盾(因为学习最大流问题是,只有 才有流量和容量。

     但是不难发现,题目所给的例图中有多个源点,多个汇点,多个普通点,只有源点和汇点才标有 x/y,普通点没有标x/y,而且所给出的所有边都有x/y 这无疑在促使我们对图做一个变形: 建议一个超级源s,一个超级汇t,使s指向所有源点,并把源点的 容量y 分别作为这些边的 容量,使所有汇点指向t,并把汇点的容量y分别作为这些边的 容量,然后本来是源点和汇点的点,全部变为普通点。这样就把“多源多汇最大流”变形为“单源单汇最大流”问题。

第二个误区就是流量值。 学习最大流问题时,会发现边上的流量值是给定初始值的,但是这题的输入只有容量,没有流量,很多人马上感觉到无从入手。其实边上的流量初始值为多少都没有所谓,解最大流需要用到的只有容量。但是一般为了方便起见, 会把所有边的流量初始化为0。这样做有一个最大的好处,就是可以回避 反向弧 的存在,这个下面详细叙述。

 

本题中要注意的是:

1、  如果输入中,某一点上有环,就无视掉。环是否存在不影响最终结果。

2、  一般两点之间都是单边,一旦存在双边也没有问题,因为由定义知两个方向的容量一定相等(其实不相等也无妨,因为其中有一条为 反向弧,前面已经提到 反向弧 是可以直接回避、无视的,因此反向弧上的容量为多少就不重要了),而且在寻找增广路的标号过程中,搜索的是未标号的点,就是说(u,v)这条弧即使是双向的,但一旦从u到达v后,就不能回头了,因为两者都被标记了,即另外一条弧就不起任何作用了。

 

下面详细说说为什么能够回避反向弧。

首先需要明确,任意一个点j上记录的信息有:

1、  寻找增光路时,除超级源s外,增广路上任一点j都有一个唯一的前驱ii被记录在j

2、  min{ij的容流差,l(vi)}

3、  构图时,除超级汇t外,图上任一点j都会直接指向一些点(这些点作为后继点,同在记录在j)

 

从这个特点可以知道,从超级源开始寻找增广路时,万一遇到双向边,正向弧,反向弧自动被回避。万一遇到单向边,如果是非饱和正向弧,就会继续走下去;如果是反向弧,这条弧必然是 零弧(每条边初始化流量均为0),定义知如果增广路有反向弧,它必须要是非零弧,而且由于反向弧每次都不会经过,所以在改进增广路时反向弧上的流量也不会被改变,永远为0,也就与最终结果无关了

 

最后当无法寻找增广路时,最大流就是与超级源s直接关联的边上的 流量之和

 

  1 /*BFS+压入重标法*/
2
3
4 //Memory Time
5 //384K 860MS
6
7 #include<iostream>
8 using namespace std;
9
10 const int inf=10001;
11
12 int n; //总节点数
13 int np; //电站数
14 int nc; //用户数
15 int line; //线路数
16 int cap[102][102]; //弧(u,v)的容量
17 int flow[102][102]; //弧(u,v)的流量
18 bool vist[102]; //标记点v是否已标号
19 int s,t; //超级源,超级汇
20
21 class info //当前点v的标记信息
22 {
23 public:
24 int pre; //当前点v的前驱u
25 int lv; //l(v)
26 int nei[101]; //当前结点直接指向的邻居结点
27 int pn; //邻居结点的指针
28 }node[102];
29
30 int min(int a,int b)
31 {
32 return a<b?a:b;
33 }
34
35 void back(void)
36 {
37 int x=t;
38 while(x!=s)
39 {
40 flow[ node[x].pre ][x] += node[t].lv; //改进增广路
41 x=node[x].pre;
42
43 }
44 return;
45 }
46
47 bool bfs(void)
48 {
49 memset(vist,false,sizeof(vist));
50 node[s].pre=-1;
51 node[s].lv=inf;
52 vist[s]=true;
53
54 int queue[102];
55 int head=0;
56 int tail=0;
57 queue[tail++]=s;
58
59 while(head<=tail-1) //注意,这是再也找不到增广路的结束条件
60 {
61 int x=queue[head];
62 int y;
63 for(int i=0;i<node[x].pn;i++)
64 {
65 y=node[x].nei[i];
66 if(!vist[y] && flow[x][y]<cap[x][y]) //搜索的目标要求是 未标记 & 非饱和弧
67 {
68 queue[tail++]=y;
69
70 vist[y]=true;
71 node[y].pre=x;
72 node[y].lv=min( node[x].lv , cap[x][y]-flow[x][y] );
73 }
74 if(vist[t]) //当超级汇被标记
75 break;
76 }
77 if(!vist[t])
78 head++;
79 else
80 return true; //搜索到一条增广路
81 }
82 return false;
83 }
84
85 int main(int i,int j,int u,int v,int z,char temp)
86 {
87 while(cin>>n>>np>>nc>>line)
88 {
89 /*Initial*/
90
91 s=n;
92 t=n+1;
93 for(i=0;i<n+1;i++)
94 node[i].pn=0;
95
96 /*Input & Structure Maps*/
97
98 for(i=1;i<=line;i++)
99 {
100 cin>>temp>>u>>temp>>v>>temp>>z;
101 if(u==v)
102 continue; //不需要环
103 cap[u][v]=z;
104 flow[u][v]=0; //每条边的流量都初始化为0
105 node[u].nei[ node[u].pn++ ]=v;
106 }
107 for(i=1;i<=np;i++)
108 {
109 cin>>temp>>v>>temp>>z;
110 cap[s][v]=z; //建立超级源,指向所有电站
111 flow[s][v]=0;
112 node[s].nei[ node[s].pn++ ]=v;
113 }
114 for(i=1;i<=nc;i++)
115 {
116 cin>>temp>>u>>temp>>z;
117 cap[u][t]=z; //建立超级汇,被所有用户指向
118 flow[u][t]=0;
119 node[u].nei[ node[u].pn++ ]=t;
120 }
121
122 /*标号法找增广轨*/
123
124 while(true)
125 {
126 if(bfs()) //如果能搜到到增广路
127 back(); //从超级汇开始回溯,改进增广路
128 else
129 {
130 int max=0; //输出最大流
131 for(i=0;i<node[s].pn;i++)
132 max+=flow[s][ node[s].nei[i] ];
133 cout<<max<<endl;
134 break;
135 }
136 }
137 }
138 return 0;
139 }

 

 

 

转载于:https://www.cnblogs.com/lyy289065406/archive/2011/07/30/2122116.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

http强缓存在firefox和chrome之间的差异

最近回顾HTTP缓存知识的时候发现了一个问题&#xff0c;设置了强缓存和协商缓存的文件&#xff0c;点击浏览器的刷新按钮的时候在chrome和firefox中的表现不一样。具体表现为chrome走强缓存没有再次发起请求。firefox却在强缓存没有失效的情况下发了请求&#xff0c;返回了304走…

垃圾收集器–串行,并行,CMS,G1(以及Java 8中的新增功能)

4个Java垃圾收集器–错误的选择如何严重影响性能 在2014年&#xff0c;对于大多数开发人员来说&#xff0c;还有两件事仍然是个谜&#xff1a;垃圾收集和了解异性。 由于我对后者知之甚少&#xff0c;所以我认为我会对前者大吃一惊&#xff0c;特别是因为在该领域中&#xff0c…

基于webpack的react脚手架

一、前言&#xff1a;react的cli开发模式太过于简单&#xff0c;好多东西都要自己配置 二、这里有个简单的配置&#xff0c;可以直接上手开发(不熟悉webpack和npm的绕路)&#xff0c;已经完成的配置如下 1&#xff1a;默认ejs模板 2&#xff1a;编译less、scss 3&#xff1…

从数学到密码学(八)

数学基础&#xff08;三&#xff09; 从本节起&#xff0c;我们开始进入大学数学的领域&#xff0d;&#xff0d;近世代数&#xff08;也称抽象代数&#xff09;。 先给出几个基本概念/定义。 [代数运算]&#xff1a;对于集合A的任意元素a、b&#xff0c;如果按某一运算法则&am…

Oracle.ManagedDataAccess 连接数据库用户名密码错误

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\FipsAlgorithmPolicy] “Enabled” dword&#xff1a;00000000 转载于:https://www.cnblogs.com/Elcser/p/11134100.html

IE9下apply的使用方式

起初看到这段代码的时候先不管在干啥&#xff0c;仅仅是尝试理解就发现很绕&#xff0c;现记下以便回顾。 Function.prototype.apply.call(console.error, console, args);其实主要做的事情就是console.error(array)&#xff0c;使用数组作为参数调用console.error。 分解&am…

不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会

越来越多的人通过为他们的业务采用功能性编程来赶上我们平台的最新更新。 在Data Geekery &#xff0c;我们将Java 8用于jOOQ集成测试&#xff0c;因为将新的Streams API与lambda表达式一起使用使生成临时测试数据变得非常容易。 但是&#xff0c; 我们并不认为JDK提供了尽可…

Redis---概述

1.概述 Redis是速度非常快的非关系型&#xff08;NoSQL&#xff09;内存键值数据库&#xff0c;可以存储键和五种不同类型的值之间的映射。 键的类型只能为字符串&#xff0c;值支持五种数据类型&#xff1a;字符串&#xff0c;列表&#xff0c;集合&#xff0c;散列表&#xf…

AJAX Control Toolkit——DropShadow(阴影和圆角框)

该控件的效果就是可以使相应的Panel产生阴影和圆角框的效果&#xff0c;要说的是该控件在CSS3来临之际并不存在多大的意义了&#xff0c;因为在CSS3中同样可以实现而且更加理想的效果。 但是要说明的是不要为目标Panel添加过多的CSS属性&#xff0c;不然会出现预料之外的效果&a…

node实现简单的群体聊天工具

一、使用的node模块 1、express当做服务器 2、socket.io 前后通信的桥梁 3、opn默认打开浏览器的模块(本质上用不到) 难点&#xff1a;前后通信 源码地址&#xff1a;https://github.com/wjf444128852/SimpleChat 欢迎clone并运行、扩展改进、issues 二、基础样子&#…

CSS中的三种样式来源:创作人员、读者和用户代理

查看原文&#xff1a;https://www.cnblogs.com/JJJJJKKKKK/articles/4542545.html CSS中的样式一共有三种来源&#xff1a;创作人员、读者和用户代理&#xff0c;来源的不同会影响到样式的层叠方式&#xff0c;很多第一次学习CSS的朋友&#xff0c;对这三种来源可能会存在一些…

具有jOOQ和Java 8的CompletableFuture的异步SQL执行

响应式编程是一个新的流行词&#xff0c;它实际上仅表示异步编程或消息传递。 事实是&#xff0c;函数语法极大地帮助构建了异步执行链&#xff0c;今天&#xff0c;我们将看到如何使用jOOQ和新的CompletableFuture API在Java 8中做到这一点。 实际上&#xff0c;事情很简单&…

关于模板引擎handlebars.js基本用法

说明&#xff1a;模板引擎主要针对于渲染DOM&#xff0c;取代了字符串拼接&#xff0c;用下面的代码亲测handlebars模板引擎比字符串拼接渲染DOM慢了20ms&#xff0c; 这里配置一个在线DEMO&#xff0c;简单说明下handlebars.js的基本用法&#xff0c;需要根据获取的数据去渲染…

create react app创建的项目运行test的时候不能解析webpack的alisa配置的问题

使用babel插件npm install babel-plugin-module-resolver&#xff0c;并在.babelrc文件中加入如下&#xff1a; {"plugins": [["module-resolver",{"alias": {"": "./src"}}]] }详情查看babel-plugin-module-resolver插件文…

使用Spring Security的多租户应用程序的无状态会话

从前&#xff0c; 我发表了一篇文章&#xff0c;解释了构建无状态会话的原理 。 巧合的是&#xff0c;我们再次针对多租户应用程序执行同一任务。 这次&#xff0c;我们将解决方案集成到Spring Security框架中&#xff0c;而不是自己构建身份验证机制。 本文将解释我们的方法和…

C# 退出提示 事件提示两次问题

private void frmCtiState_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason CloseReason.ApplicationExitCall) return; DialogResult result MessageBox.Show("是否退出系统?", "消息", MessageBoxB…

What?一个 Dubbo 服务启动要两个小时!

前言 前几天在测试环境碰到一个非常奇怪的与 dubbo 相关的问题&#xff0c;事后我在网上搜索了一圈并没有发现类似的帖子或文章&#xff0c;于是便有了这篇。 希望对还未碰到或正在碰到的朋友有所帮助。 现象 现象是这样的&#xff0c;有一天测试在测试环境重新部署一个 dubbo …

React hook 中的数据获取

相关说明&#xff1a; 对于hook相关词不翻译&#xff0c;感觉翻译后怪怪的。 effect hook 效果钩子&#xff0c;用于执行一些副作用例如获取数据 。 state hook 状态钩子。 使用----------- 和 ----------- 标出代码需要关注的地方。 渣翻译如下&#xff1a; 在这个指南中…

嵌入式Jetty和Apache CXF:借助Spring Security来保护REST服务

最近&#xff0c;我遇到了一个非常有趣的问题&#xff0c;我认为这只花了我几分钟就解决了&#xff1a;在Windows Server 2003中使用Spring Security &#xff08;当前稳定版本3.2.5 &#xff09;保护Apache CXF &#xff08;当前版本3.0.1 &#xff09;/ JAX-RS REST服务。在嵌…

我所知道的前端组件化与模块化

序言&#xff1a;组件化&#xff1f;模块化&#xff1f;这都是什么鬼&#xff1f;这是最初看到这2个新名词的反应。随着时间的推移&#xff0c;似乎、可能、大概明白了一点&#xff0c;于是想说说自己的理解(仅仅是自己的理解) 一、组件化 忘记什么时候看到这个词的了&#x…