首页 > 其他分享 >POJ 1459 Power Network(最大流)

POJ 1459 Power Network(最大流)

时间:2023-06-12 14:37:56浏览次数:43  
标签:Power power int max flow POJ include data 1459


题意:第一眼看到这题目觉得神题啊...其实题目给的s[i]压根不用管的....总共有n个结点,其中有发电站np个、用户nc个和调度器n-np-nc个三种节点以及M条电线(用于传输电流的),每个发电站有一个最大发电量,每个用户有个最大接受电量,现在有m条有向边,边有一个最大的电流量,表示最多可以流出这么多电,现在从发电站发电到用户,问最多可以发多少电(被用户接受).

思路:建图:

          建立一个超级源点s,s到任意发电站i有(s,i,,p[i]) (表示该发电站最多能发p[i]电)

          建立一个超级汇点t,任意用户j到t有边(j,t,c[j]) (表示该用户最多能消费c[j]电)

          然后对于题目中描述的M条电线(u,v)L, 就有边(u,v,L).

          最终我们求本图的最大流即可.(到汇点t的最大流就是所有用户能消费的最大电量)



#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 550
#define INF 1e9
#define LLINF 1LL<<60
#define LL long long
int cas=1,T;
struct Edge
{
	int from,to,cap,flow;
	Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}
};
int n,m;
struct Dinic
{
//	int n,m;
    int s,t;
	vector<Edge>edges;        //边数的两倍
	vector<int> G[maxn];      //邻接表,G[i][j]表示结点i的第j条边在e数组中的序号
	bool vis[maxn];           //BFS使用
	int d[maxn];              //从起点到i的距离
	int cur[maxn];            //当前弧下标
	void init()
	{
	   for (int i=0;i<=n+1;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));        //反向弧
		int mm=edges.size();
		G[from].push_back(mm-2);
		G[to].push_back(mm-1);
	}
	bool BFS()
	{
		memset(vis,0,sizeof(vis));
		queue<int>q;
		q.push(s);
		d[s]=0;
		vis[s]=1;
		while (!q.empty())
		{
			int x = q.front();q.pop();
			for (int i = 0;i<G[x].size();i++)
			{
				Edge &e = edges[G[x][i]];
				if (!vis[e.to] && e.cap > e.flow)
				{
					vis[e.to]=1;
					d[e.to] = d[x]+1;
					q.push(e.to);
				}
			}
		}
		return vis[t];
	}

	int DFS(int x,int a)
	{
		if (x==t || a==0)
			return a;
		int flow = 0,f;
		for(int &i=cur[x];i<G[x].size();i++)
		{
			Edge &e = edges[G[x][i]];
			if (d[x]+1 == d[e.to] && (f=DFS(e.to,min(a,e.cap-e.flow)))>0)
			{
				e.flow+=f;
				edges[G[x][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())
		{
			memset(cur,0,sizeof(cur));
			flow+=DFS(s,INF);
		}
		return flow;
	}
}dc;
int main()
{
	int np,nc,m;
	while (scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF)
	{
		dc.init();
		for (int i = 0;i<m;i++)
		{
			int u,v,w;
			scanf(" (%d,%d)%d",&u,&v,&w);
            ++u,++v;
			dc.AddEdge(u,v,w);
		}
		for (int i = 0;i<np;i++)
		{
			int u,w;
			scanf(" (%d)%d",&u,&w);
			++u;
			dc.AddEdge(0,u,w);
		}
		for (int i = 0;i<nc;i++)
		{
			int u,w;
			scanf(" (%d)%d",&u,&w);
			++u;
			dc.AddEdge(u,n+1,w);
		}
		printf("%d\n",dc.Maxflow(0,n+1));
	}
	//freopen("in","r",stdin);
 	
	//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}




Description



A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport lines. A node u may be supplied with an amount s(u) >= 0 of power, may produce an amount 0 <= p(u) <= p  max(u) of power, may consume an amount 0 <= c(u) <= min(s(u),c

max(u)) of power, and may deliver an amount d(u)=s(u)+p(u)-c(u) of power. The following restrictions apply: c(u)=0 for any power station, p(u)=0 for any consumer, and p(u)=c(u)=0 for any dispatcher. There is at most one power transport line (u,v) from a node u to a node v in the net; it transports an amount 0 <= l(u,v) <= l 

max(u,v) of power delivered by u to v. Let Con=Σ 

uc(u) be the power consumed in the net. The problem is to compute the maximum value of Con. 





An example is in figure 1. The label x/y of power station u shows that p(u)=x and p 

max(u)=y. The label x/y of consumer u shows that c(u)=x and c 

max(u)=y. The label x/y of power transport line (u,v) shows that l(u,v)=x and l 

max(u,v)=y. The power consumed is Con=6. Notice that there are other possible states of the network but the value of Con cannot exceed 6. 



Input


There are several data sets in the input. Each data set encodes a power network. It starts with four integers: 0 <= n <= 100 (nodes), 0 <= np <= n (power stations), 0 <= nc <= n (consumers), and 0 <= m <= n^2 (power transport lines). Follow m data triplets (u,v)z, where u and v are node identifiers (starting from 0) and 0 <= z <= 1000 is the value of l  max(u,v). Follow np doublets (u)z, where u is the identifier of a power station and 0 <= z <= 10000 is the value of p  max(u). The data set ends with nc doublets (u)z, where u is the identifier of a consumer and 0 <= z <= 10000 is the value of c  max(u). All input numbers are integers. Except the (u,v)z triplets and the (u)z doublets, which do not contain white spaces, white spaces can occur freely in input. Input data terminate with an end of file and are correct.


Output


For each data set from the input, the program prints on the standard output the maximum amount of power that can be consumed in the corresponding network. Each result has an integral value and is printed from the beginning of a separate line.


Sample Input


2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)207 2 3 13 (0,0)1 (0,1)2 (0,2)5 (1,0)1 (1,2)8 (2,3)1 (2,4)7 (3,5)2 (3,6)5 (4,2)7 (4,3)5 (4,5)1 (6,0)5 (0)5 (1)2 (3)2 (4)1 (5)4


Sample Output


156


Hint


The sample input contains two data sets. The first data set encodes a network with 2 nodes, power station 0 with pmax(0)=15 and consumer 1 with cmax(1)=20, and 2 power transport lines with lmax(0,1)=20 and lmax(1,0)=10. The maximum value of Con is 15. The second data set encodes the network from figure 1.





标签:Power,power,int,max,flow,POJ,include,data,1459
From: https://blog.51cto.com/u_16156555/6462532

相关文章

  • POJ1787
    POJ1787一开始还没看多重背包…以为是完全背包加个限制条件,然后想了好久没想不出,看了下背包九讲..看到多重背包可是也没什么思路…后来搜了一下题解…豁然开朗dp[j]表示j块钱最多由多少块硬币组成,path[j]表示上一次最多有多少块构成的j块钱,used[j]表示j块钱时,已经放了......
  • POJ 3264 Balanced Lineup
    思路:线段树求最大值减最小值,每个结点分别维护最大值和最小值即可。#include<cstdio>#include<queue>#include<cstring>#include<iostream>#include<cstdlib>#include<algorithm>#include<vector>#include<map>#include<string>#in......
  • POJ1837 DP
    POJ1837DP题题目一开始看了N久…意思大概是有一个天平,左边臂长是-15到0,右边臂长是0到15,给你c个挂钩,g个砝码,每一个砝码重量都在1到25,问将所有砝码挂到天平上并使之平衡的方案有多少个。要使之平衡由物理知识可知力矩=0,左边重量X左边臂长+右边重量X右边臂长=0,故状态一共有25*15......
  • POJ 2352 HDU1541 Stars(树状数组)
    题意:二维平面给定n个点的坐标,然后要你输出每个点的“等级“。每个点的等级是它的左下放的点个数(包括正下放和正左方的点)。即要你输出对于每个点(x,y)来说,有多少点的坐标(xi,yi)满足xi<=x且yi<=y。思路:题目给出的坐标中已经是按y升序排列,那么其实只用考虑x轴,那么显然就是在前面的......
  • POJ 3498 March of the Penguins(枚举+最大流)
    题意:在X,Y坐标系中有N(N<=100)个冰块...有些冰块上有若干只企鹅..每只企鹅一次最多跳M距离..一个冰块在有Mi个企鹅离开..就会消失..问有哪些冰块可以作为集合点..就是所有企鹅都能成功到这个冰块上来.思路:枚举每一块冰块,看看最大流能否等于企鹅总数即可      建图:把每块......
  • POJ 2019 Cornfields(简单二维RMQ)
    思路:二维RMQ#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;constintMAXN=255;intval[MAXN][MAXN];intdmin[MAXN][MAXN][8][8];intdmax[MAXN][MAXN][8][8];voidinitRMQ(intn,intm){for(inti=1;i<=n;i++)......
  • 利用PowerDesigner将oracle表结构转成mysql表结构
    1、导出ORACLE表结构2、File->ReverseEngineer->Database,设置物理模型的名称及所使用数据库类型,选择Oracleversion11g,然后点击Usingscriptfiles框里的AddFiles按钮,选择已经导出的Oracle表结构sql文件3、改变数据库类型,Database->ChangeCurrentDBMS,CurrentDBMS......
  • Powershell 应用之一
    前言:对于一个Windowsserver运维的管理员来说,powershell命令至关重要,它不仅仅能够提高你的工作效率,也是你工作中的好帮手,所以应该静下心来好好学习命令,虽然一开始不太习惯用着用着你就会爱不释手。一、AD对象日常管理用户管理例子1:统计OU下总共有多少个AD账号(Get-ADUser-Filter......
  • pojo层
    Answerpackagecom.example.academicadministration.pojo;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importjava.sql.Timestamp;@Data@AllArgsConstructor@NoArgsConstructorpublicclassAnswer{privateStr......
  • Python统计多个Powerpoint文件中幻灯片总数量
    晚上吃饭时突然想知道自己做了多少页《Python程序设计》系列教材的配套PPT,于是就有了下面的代码,这套PPT综合了《Python程序设计基础》(ISBN:9787302410584)、《Python程序设计(第2版)》(ISBN:9787302436515)和《Python可以这样学》(ISBN:9787302456469)以及将要出版的《Python程序设计开发宝典......