NOI2006 最大获利(最大权闭合子图)

codevs 1789 最大获利

2006年NOI全国竞赛

时间限制: 2 s

空间限制: 128000 KB

题目描述 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 Description

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

输出描述 Output Description

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

样例输入 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

数据范围及提示 Data Size & 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。

最大权闭合子图

源点向所有用户连流量为收益的边

所有中转站向汇点连流量为成本的边

用户所需要的中转站,由用户向需要的中转站连inf边

然后用所有用户收益和-最小割

#include<cstdio>
#include<queue>
#include<algorithm>
#define N 55010
#define M 50001
#define inf 2e9
using namespace std;
int n,m,tot=1;
int src,dec,sum;
int lev[N],cur[N],front[N],cap[M*10],to[M*10],next[M*10];
queue<int>q;
void add(int u,int v,int w)
{
    to[++tot]=v;next[tot]=front[u];front[u]=tot;cap[tot]=w;
    to[++tot]=u;next[tot]=front[v];front[v]=tot;cap[tot]=0;
}
bool bfs()
{
    for(int i=0;i<=dec;i++) {lev[i]=-1;cur[i]=front[i];}
    while(!q.empty()) q.pop();
    q.push(src);lev[src]=0;
    while(!q.empty())
    {
        int now=q.front();q.pop();
        for(int i=front[now];i;i=next[i])
        {
            int t=to[i];
            if(cap[i]>0&&lev[t]==-1)
            {
                lev[t]=lev[now]+1;
                if(t==dec) return true;
                q.push(t);
            }
        }
    }
    return false;
}
int dinic(int now,int flow)
{
    if(now==dec) return flow;
    int rest=0,delta;
    for(int & i=cur[now];i;i=next[i])
    {
        int t=to[i];
        if(cap[i]>0&&lev[t]>lev[now])
        {
            delta=dinic(t,min(cap[i],flow-rest));
            if(delta)
            {
                cap[i]-=delta;cap[i^1]+=delta;
                rest+=delta;if(rest==flow) break;
            }
        }

    }
    if(rest!=flow) lev[now]=-1;
    return rest;
}
int main()
{
    scanf("%d%d",&n,&m);
    dec=n+m+1;
    int x,y,z;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        add(i,dec,x);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        add(src,n+i,z);
        add(n+i,x,inf);
        add(n+i,y,inf);
        sum+=z;
    }
    while(bfs())
    sum-=dinic(src,inf);
    printf("%d",sum);
}

空间问题,今天下午第n次开小空间

时间: 2024-12-26 00:32:10

NOI2006 最大获利(最大权闭合子图)的相关文章

bzoj1497 最大获利(最大权闭合子图)

题目链接 思路 对于每个中转站向\(T\)连一条权值为建这个中转站代价的边.割掉这条边表示会建这个中转站. 对于每个人向他的两个中转站连一条权值为\(INF\)的边.然后从\(S\)向这个人连一条权值为这个人的收益的边,割掉这条边表示不要这个收益. 这就是最大权闭合子图的模型. 最后的答案=全部的收益-割掉的收益-建中转站的代价=全部收益-最小割 代码 #include<cstring> #include<algorithm> #include<queue> #incl

BZOJ 1497 最大获利(最大权闭合子图)

http://www.lydsy.com/JudgeOnline/problem.php?id=1497 思路:由题意可以得知,每个顾客都依赖2个中转站,那么让中转站连有向边到汇点,流量为它的建设费用,源点连到每个顾客,流量为赚的钱,然后每个顾客到它依赖的中转站连流量为inf的边 1 #include<algorithm> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include&

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

1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5503  Solved: 2673 Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研究.站址勘测.最优化等项目.在前期市场调查和站址勘测之后,公司得到了一共N个可以作为通讯信号中转站的地址,而由于这

【最大权闭合子图】BZOJ1497[NOI2006]-最大获利

[题目大意] 建立第i个通讯中转站需要的成本为Pi(1≤i≤N).另外公司调查得出了所有期望中的用户群,一共M个.关于第i个用户群的信息概括为Ai, Bi和Ci:这些用户会使用中转站Ai和中转站Bi进行通讯,公司可以获益Ci.(1≤i≤M, 1≤Ai, Bi≤N) THU集团的CS&T公司可以有选择的建立一些中转站(投入成本),为一些用户提供服务并获得收益(获益之和).那么如何选择最终建立的中转站才能让公司的净获利最大呢?(净获利 = 获益之和 - 投入成本之和) [思路] 根据最大权闭合子图的

1497. [NOI2006]最大获利【最大权闭合子图】

Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研究.站址勘测.最优化等项目.在前期市场调查和站址勘测之后,公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第i个通讯中转站需要的成本为Pi(1≤i≤N).另外公

bzoj 1497 [NOI2006]最大获利【最大权闭合子图+最小割】

不要被5s时限和50000点数吓倒!大胆网络流!我一个5w级别的dinic只跑了1s+! 看起来没有最大权闭合子图的特征--限制,实际上还是有的. 我们需要把中转站看成负权点,把p看成点权,把客户看成正权点,把c看成点权,然后把中转站点a.b作为客户点的依赖点 s点向所有正权点连边,流量为点权:所有负权点向t连边,流量为负点权(即正数!) 对于所有有依赖关系的点,由客户点向中转站点连边,流量为inf,也就是最大权闭合子图中的向其依赖点连边 连边的意义详见:http://www.cnblogs.c

[BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497 分析: 这是在有向图中的问题,且边依赖于点,有向图中存在点.边之间的依赖关系可以考虑最大权闭合子图 假设a与b之间有权值为c的边(根据题意是双向边) 那么我们可以建一个新节点,点的权值为c,并指向a点和b点(单向),同时断掉原本a,b之间的双向边,a,b的点的权值是它们的花费(负的) 那么对于原问题就转化成了求最大权闭合子图的问题了 ——————————————————————

我和最大权闭合子图

第一次接触最大权闭合子图大概是2017年3月27号星期一,那段时间有5个同学(ZJC/LKQ/LWD/WJJ/...)去了湖南师大附中听PTY.BK他们讲课,因为我没有去Hfu一直很怪罪.后来安排我和LXY在70去电子科大之前去考一周的试,上午LXY的Mom接送,下午我们坐metro到世纪城再让LXY的Mom送回学校上晚自习.那一天我去70,T1是分治Floyd,T2是轮廓线DP,T3是一道最大权闭合子图(后来知道是BZOJ 3774 最优选择).那时我只会Dinic的模板,我的初高中学长Ana

最大权闭合子图 ( 最大流最小割模型 )

引入闭合子图的概念 : 通俗点说就是选出一个图的子图,使得子图中的所有点出度指向的点依旧在这个子图内,则说明此子图是闭合子图. 最大权闭合子图 : 假设每个点具有点权值,在一个图的所有闭合子图中,点权之和最大的即是最大权闭合子图. 求取最大权闭合子图的权值之和是有一个结论的 一.先抽象出一个超级源.汇点 二.将权值为正的点和超级源点连接.容量为权值 三.将权值为负的点和超级汇点连接.容量为权值的绝对值 四.然后除了源.汇之外的点原本怎么连泽怎么连.且容量为无穷大 五.最大权闭合子图权值  =