poj 1459 zoj 1734 Power Network(最大流)

2024-06-15 19:38

本文主要是介绍poj 1459 zoj 1734 Power Network(最大流),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

电网 中一些节点  可能会消耗电能  提供电能  

节点之间有电线传输电能  传输的电能有上限值

节点中没有 源点和汇点 类型的节点 

所以需要我们添加源点汇点  n个节点 从0开始 设源点为n+1  汇点为n+2

源点到每个电站之间添加一条边 权值为该电站能够提供的电能

每个消费者与汇点之间添加一条边 权值为该消费者消费的电能

根据所给的 电线中的起点和重点 添加边 权值为该电线能够传输电能的最大值

然后就是读取数据  先把(字符之前所有的字符 读掉 然后读入括号中的数

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>#define eps 1e-8
#define op operator
#define MOD  10009
#define MAXN  110
#define INF 0x7fffffff
#define MEM(a,x)    memset(a,x,sizeof a)
#define ll __int64using namespace std;struct Dinic
{struct Edge{int from,to,cap,flow;Edge(){}Edge(int from,int to,int cap,int flow):from(from),to(to),cap(cap),flow(flow){}};vector<Edge> edges;vector<int> G[MAXN];bool vis[MAXN];int d[MAXN];int cur[MAXN];int n,m,s,t,maxflow;void init(int n){this->n=n;for(int i=0;i<=n;i++)G[i].clear();edges.clear();}void addedge(int from,int to,int cap){edges.push_back(Edge(from,to,cap,0));edges.push_back(Edge(to,from,0,0));m=edges.size();G[from].push_back(m-2);G[to].push_back(m-1);}bool bfs(){MEM(vis,0);MEM(d,-1);queue<int> q;q.push(s);d[s]=maxflow=0;vis[s]=1;while(!q.empty()){int u=q.front(); q.pop();int sz=G[u].size();for(int i=0;i<sz;i++){Edge e=edges[G[u][i]];if(!vis[e.to]&&e.cap>e.flow){d[e.to]=d[u]+1;vis[e.to]=1;q.push(e.to);}}}return vis[t];}int dfs(int u,int a){if(u==t||a==0)  return a;int sz=G[u].size();int flow=0,f;for(int &i=cur[u];i<sz;i++){Edge &e=edges[G[u][i]];if(d[u]+1==d[e.to]&&(f=dfs(e.to,min(a,e.cap-e.flow)))>0){e.flow+=f;edges[G[u][i]^1].flow-=f;flow+=f;a-=f;if(a==0)  break;}}return flow;}int Maxflow(int s,int t){this->s=s; this->t=t;int flow=0;while(bfs()){MEM(cur,0);flow+=dfs(s,INF);}return flow;}
}Dic;int main()
{
//freopen("ceshi.txt","r",stdin);int n,np,nc,m;while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF){int s=n+1,t=n+2;Dic.init(n+2);for(int i=0;i<m;i++){int u,v,w;while(getchar()!='(');scanf("%d,%d)%d",&u,&v,&w);Dic.addedge(u,v,w);}for(int i=0;i<np;i++){int v,w;while(getchar()!='(');scanf("%d)%d",&v,&w);Dic.addedge(s,v,w);}for(int i=0;i<nc;i++){int u,w;while(getchar()!='(');scanf("%d)%d",&u,&w);Dic.addedge(u,t,w);}printf("%d\n",Dic.Maxflow(s,t));}return 0;
}


 

这篇关于poj 1459 zoj 1734 Power Network(最大流)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064390

相关文章

关于修改计算机的处理器数和最大内存数的问题

问题描述: 刚开始本来是想让计算机的运行速度运行的快点,于是在网上搜索如何让计算机的运行速度更快,找到了一种关于修改计算机内存数和计算机的处理核数可以让计算机运行的更快。 遇到问题: 当我通过命令msconfig →引导→高级选项→勾选了处理器数和最大内存数,然后重启,结构整个计算机都卡的要死,于是记录下来。网上的答案有时候真的是很不负责任,也有可能是自己技术不到位。 结果:取消处理器和内

poj 3882(Stammering Aliens) 后缀数组 或者 hash

后缀数组:  构建后缀数组,注意要在字符串莫末尾加上一个没出现过的字符。然后可以2分或者直接扫描,直接扫描需要用单调队列来维护 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string

poj 3294(Life Forms) 2分+ 后缀数组

我曾用字符串hash写,但是超时了。只能用后最数组了。大致思路:用不同的符号吧字符串连接起来,构建后缀数组,然后2分答案,依次扫描后缀数组,看是否瞒住条件。 VIEW CODE #include<cstdio>#include<vector>#include<cmath>#include<algorithm>#include<cstring>#include<cassert>#

poj 2391 Ombrophobic Bovines (网络流)

这是一道很经典的网络流的题目。首先我们考虑假如我们的时间为无穷大。我们吧每个点拆成2个点 i和i' .。虚拟源点s和汇点t。对于每个点建边(s,i, a[i])  (i‘,t,ib[i]) 。 其中a[i]为给点有多少牛,b[i]为容量。i和j连通 建边 (i,j',inf);如果最大流==所有牛的个数,就可能装下所有的牛。那么现在我们考虑时间。假设最大时间为T.那么如果i到j的的最短时间>T

poj 1330 LCA 最近公共祖先

水题目。直接上代码了。 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<map>#include<vector>#

poj 3160 Father Christmas flymouse 强连通+dp

首先我们可以确定的是,对于val值小于0的节点都变成0.   假设一个集合内2个房间都能任意到达,那么我就可以吧集合内的所有点的价值都取到,并且可以达到任一点。实际上集合内的每个点是相同的,这样的集合就是一个强连通分量。 那么我们就可以用tarjin算法进行强连通缩点, 最后形成一个dag的图。在dag的图上面进行dp。可以先用拓扑排序后dp。或者建反响边记忆化搜索 。 VIEW

LeetCode 算法:二叉树的最大深度 c++

原题链接🔗:二叉树的最大深度 难度:简单⭐️ 题目 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root = [1,null,2] 输出:2 提示: 树中节点的数量在 [0, 104] 区间内。-1

「LeetCode 084」最大面积

题目地址: https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。 example 第一种方法,我们先确定左右两个边界,然后找边界中的最小值。比方说,我们左边界确定

最大子数组问题(第4章:分治策略)

求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。   思路 1 当我们加上一个正数时,和会

代码随想录算法训练营day62 | 42. 接雨水、84.柱状图中最大的矩形

42. 接雨水 暴力解法 遍历每根柱子(第一个和最后一个不需要遍历,因为不可能存住水),找到当前柱子的左边最高柱子lHeight,右边最高柱子rHeight,当前柱子能存的水为min(min(lHeight, rHeight) - 当前柱子的高度, 0) class Solution:def trap(self, height: List[int]) -> int:result = 0for