首页 > 其他分享 >BZOJ 1497: [NOI2006]最大获利 最大权闭合子图

BZOJ 1497: [NOI2006]最大获利 最大权闭合子图

时间:2023-07-07 13:32:39浏览次数:40  
标签:Ci ch 子图 Bi NOI2006 通讯 include 1497 中转站



1497: [NOI2006]最大获利


Time Limit: 5 Sec  Memory Limit: 64 MB

Submit: 5196  Solved: 2530

[Submit][Status][Discuss]

Description


新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战。THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研究、站址勘测、最优化等项目。在前期市场调查和站址勘测之后,公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第i个通讯中转站需要的成本为Pi(1≤i≤N)。另外公司调查得出了所有期望中的用户群,一共M个。关于第i个用户群的信息概括为Ai, Bi和Ci:这些用户会使用中转站Ai和中转站Bi进行通讯,公司可以获益Ci。(1≤i≤M, 1≤Ai, Bi≤N) THU集团的CS&T公司可以有选择的建立一些中转站(投入成本),为一些用户提供服务并获得收益(获益之和)。那么如何选择最终建立的中转站才能让公司的净获利最大呢?(净获利 = 获益之和 - 投入成本之和)


Input


输入文件中第一行有两个正整数N和M 。第二行中有N个整数描述每一个通讯中转站的建立成本,依次为P1, P2, …, PN 。以下M行,第(i + 2)行的三个数Ai, Bi和Ci描述第i个用户群的信息。所有变量的含义可以参见题目描述。


Output


你的程序只要向输出文件输出一个整数,表示公司可以得到的最大净获利。


Sample Input


5 5
1 2 3 4 5
1 2 3
2 3 4
1 3 3
1 4 2
4 5 3


Sample Output


4


HINT


【样例说明】选择建立1、2、3号中转站,则需要投入成本6,获利为10,因此得到最大收益4。【评分方法】本题没有部分分,你的程序的输出只有和我们的答案完全一致才能获得满分,否则不得分。【数据规模和约定】 80%的数据中:N≤200,M≤1 000。 100%的数据中:N≤5 000,M≤50 000,0≤Ci≤100,0≤Pi≤100。




哇塞

我竟然秒杀了国赛题!

括弧:几个小时之前刚做过类型题。。。。

和 BZOJ 3996: [TJOI2015]线性代数 最大权闭合子图 最小割 几乎没区别

去看那篇吧

那篇超赞的博客


#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<complex>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<queue>
#include<set>
#include<map>
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return f*x;
}
const int N=55500;const int inf=0X7f7f7f7f;
int n,m,ecnt=1,last[N],d[N],q[N],cur[N],T=N-1,S=0,ans;
struct EDGE{int to,nt,val;}e[N<<3];
inline void readd(int u,int v,int val)
{e[++ecnt]=(EDGE){v,last[u],val};last[u]=ecnt;}
inline void add(int u,int v,int val)
{readd(u,v,val);readd(v,u,0);}
bool bfs()
{
	memset(d,0,sizeof(d));
	d[S]=1;int head=0,tail=1;q[0]=S;
	while(head<tail)
	{
		int u=q[head++];
		for(int i=last[u];i;i=e[i].nt)
		if(e[i].val&&!d[e[i].to])
		{
			q[tail++]=e[i].to;
			d[e[i].to]=d[u]+1;
		}
	}
	return d[T];
}
int dfs(int u,int lim)
{
	if(u==T||lim==0)return lim;
	int flow=0;
	for(int i=cur[u];i;i=e[i].nt)
	if(d[u]+1==d[e[i].to])
	{
		int tmp=dfs(e[i].to,min(lim,e[i].val));
		e[i].val-=tmp;e[i^1].val+=tmp;lim-=tmp;flow+=tmp;
		if(lim==0)break;if(e[i].val)cur[u]=i;
	}
	if(!flow)d[u]=-1;
	return flow;
}
void dinic()
{while(bfs()){for(int i=0;i<=n+m;i++)cur[i]=last[i];cur[T]=last[T];ans-=dfs(S,inf);}}
int main()
{
	n=read();m=read();int u,v,val;
	for(int i=1;i<=n;i++){val=read();add(i,T,val);}
	for(int i=1;i<=m;i++){u=read();v=read();val=read();ans+=val;add(S,n+i,val);add(n+i,u,inf);add(n+i,v,inf);}
	dinic();
	printf("%d\n",ans);
	return 0;
}




标签:Ci,ch,子图,Bi,NOI2006,通讯,include,1497,中转站
From: https://blog.51cto.com/u_16181403/6652022

相关文章

  • BZOJ 3996: [TJOI2015]线性代数 最大权闭合子图 最小割
    3996:[TJOI2015]线性代数TimeLimit: 10Sec  MemoryLimit: 128MBSubmit: 1499  Solved: 885[Submit][Status][Discuss]Description给出一个N*N的矩阵B和一......
  • 【Python】在同一图形中更加优雅地绘制多个子图
    1.引言数据可视化非常重要,有一句俗语叫做一图顶千言,我相信好多小伙伴应该都听说过这句话;即使是有人第一次听到,我想应该也会觉得赞成,这足以说明数据可视化的重要性。我们在前一篇博客中,介绍了如何利用subplot来在一张子图里绘制多个子图,最近我又发现了一种更加优雅地实现,迫不及待地......
  • 【Python】在同一图形中的绘制多个子图
    1.引言有时我们需要并排绘制两个图形,这不仅是为了更好地利用空间,而且主要是因为为了更加直观地对比分析数据。其实在python中可以利用subplot来实现上述功能。闲话少说,我们直接开始吧!2.准备工作这里,我们不妨先来举个例子,比方说,我们正在分析一家出租车公司的出行分布,假设我们想知......
  • 【QoS预测】用于冷启动QoS预测的基于图对比学习的双子图网络
    论文题目:ZhuJ,LiB,WangJ,etal.BGCL:Bi-subgraphnetworkbasedongraphcontrastivelearningforcold-startQoSprediction[J].Knowledge-BasedSystems,2023,263:110296.问题:通过利用用户和服务之间的历史交互记录,协同过滤(Collaborativefiltering)成为了一种......
  • python · matplotlib | 如何绘制子图
    代码:importmatplotlib.pyplotaspltimportmatplotlibmatplotlib.rc("font",family='MicroSoftYaHei',weight="bold")fig,axs=plt.subplots(2,2,figsize=(15,12))colors=['blue','orange','green&#......
  • CINN 中子图编译缓存机制
    采用「问-答」形式记录研读CINN开源框架的笔记Q:CINN中子图编译的入口是在哪里?for(constauto&node_vec:clusters){//<-------逐个遍历每个子图//Classifyvarnodetoinputs,outputs,andinternals.GraphNodeSetcluster_set(node_vec.begin(),n......
  • 最大权闭合子图
    最大权闭合子图一、概念闭合子图给定一个有向图\(G(V,E)\),图中的某一个点集,这个点集满足内部的所有边不能从点集里面指向点集外面,则将这个点集和点集里面的边统称为原图的闭合子图最大权闭合子图给定一个有向图\(G(V,E)\),每个点上有一个权值,图中存在若干个闭合子图,若其中一......
  • 量子图形加密算法的MATLAB代码实现
    一、概述目前主流的量子图形加密算法有量子像素编码算法(QuantumImagePixelEncoding,QIPE)、量子像素置乱算法(QuantumImagePixelScrambling,QIPS)等。一个简......
  • AcWing 1497. 树的遍历
    【题目描述】一个二叉树,树中每个节点的权值互不相同。现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。【输入格式】第一行包含整数N,表示二叉树的节点数。第二行包......
  • 最大权闭合子图
    前置知识:最大权闭合子图。这是个什么东东呢,它是对于每一个点赋一个值,求一个点集,点集内的所有点都必须包含它的所有后继,使这个点集的和最大。如以下图:图中的编号代表点......