下界最小费用最大流

bzoj 3876 支线任务

对于每一条边(x->y) 费用为z: S-> y 流量为1 费用为z 表示必须经过此边

                x-> y 流量为inf 费用为z 表示除此以外还可以随意走动

对于每一个点 x   x-> T 流量为 x的出度 费用为0

        x-> 1 流量为 inf  费用为0  对应题目中的初始点 可以返回

另看到有很多人 都只跑了100多ms 这是什么高明的做法求解 QAQ 还是 too naive

 1 #include <bits/stdc++.h>
 2 #define N 310
 3 #define M 50000
 4 #define inf 0x7fffffff
 5 using namespace std;
 6
 7 inline int read()
 8 {
 9     int x=0,f=1;char ch=getchar();
10     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
11     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
12     return x*f;
13 }
14 struct edge
15 {
16     int u,v,w;
17     int next,c;
18 }vs[M];
19
20 int n,ee=1,st[N],from[N],S,T;
21 int ans=0,vis[N],dis[N],p[N];
22 queue <int> q;
23 inline void addedge(int u,int v,int w,int c)
24 {
25     vs[++ee].u=u;vs[ee].v=v;vs[ee].w=w;
26     vs[ee].next=st[u];st[u]=ee;vs[ee].c=c;
27 }
28 inline void insert(int u,int v,int w,int c)
29 {
30     addedge(u,v,w,c);addedge(v,u,0,-c);
31 }
32 bool spfa()
33 {
34     for(int i=S;i<=T;i++) dis[i]=inf;
35     while(!q.empty())q.pop();
36     q.push(S);dis[S]=0;vis[S]=1;
37     while(!q.empty())
38     {
39         int lx=q.front();q.pop();
40         for(int i=st[lx];i;i=vs[i].next)
41             if(vs[i].w&&dis[lx]+vs[i].c<dis[vs[i].v])
42             {
43                 dis[vs[i].v]=dis[lx]+vs[i].c;
44                 from[vs[i].v]=lx;p[vs[i].v]=i;
45                 if(!vis[vs[i].v]) q.push(vs[i].v),vis[vs[i].v]=1;
46             }
47         vis[lx]=0;
48     }
49 //  for(int i=S;i<=T;i++) printf("%d ",dis[i]);printf("\n");
50     return dis[T]!=inf;
51 }
52 inline void mcf()
53 {
54     int ss=inf;for(int i=T;i!=S;i=from[i])
55         ss=min(ss,vs[p[i]].w);
56     for(int i=T;i!=S;i=from[i])
57     {
58         vs[p[i]].w-=ss;vs[p[i]^1].w+=ss;
59         ans+=ss*vs[p[i]].c;
60     }
61 }
62 int main()
63 {
64     n=read();
65     S=0;T=n+1;
66     for(int i=1;i<=n;i++)
67     {
68         int k=read();
69         for(int j=1;j<=k;j++)
70         {
71             int a=read(),b=read();
72             insert(S,a,1,b);
73             insert(i,a,inf,b);
74         }
75         insert(i,T,k,0);
76         if(i!=1) insert(i,1,inf,0);
77     }
78     /* printf("%d\n",ee);
79     for(int i=2;i<=ee;i++) printf("%d %d %d\n",vs[i].v,vs[i].w,vs[i].c); */
80     while(spfa()) mcf();
81     printf("%d\n",ans);
82     return 0;
83 }

时间: 2024-10-25 23:40:27

下界最小费用最大流的相关文章

【BZOJ3876】【Ahoi2014】支线剧情 有下界的最小费用最大流

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43025375"); } [BZOJ2324]营救皮卡丘 这道题也是一道有下界的最小费用最大流. 我的题解地址:http://blog.csdn.net/vmurder/article/details/41378979 这道题其实就是模板题. 我的处理

【BZOJ-3876】支线剧情 有上下界的网络流(有下界有源有汇最小费用最大流)

3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 502[Submit][Status][Discuss] Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现在JYY想花费最少的时间看完所有的支线剧情. [问题描述] JYY现在所玩的R

UVa11082 Matrix Decompressing(最小费用最大流)

题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况. POJ2396的弱化版本吧..建图的关键在于: 把行.列看成点,各单元看成边 这个建图感觉非常巧.. 各个单元有下界限制..这个我可不想再写带下界的最大流.. 想了下,发现可以用最小费用最大流求解:通过放大边的费用,使得这条边成为一条必须会被经过的边. 简单来说就是各单元代表的边拆成两条,一条容量1费用-1,另外一条容量19费用0.这样跑MCMF,显然为了

【CF708D】Incorrect Flow 最小费用可行流

[CF708D]Incorrect Flow 题意:给你一个点数为n,边数为m的流网络,每条边有一个容量c和流量f,这个网络可能是不合法的.你可以花费1的代价使c或f减少或增加1,可以修改无限次.你不需要使流量最大,你只需要花费最少的代价把原图改造成一个合法的网络. $n,m\le 100,c,f\le 10^6$ 题解:我们用有上下界的费用流来解决这个问题. 对于一条边a->b,如果c>f,则我们从a到b连一条下界和上界都是f,费用为0的边:因为可以减少流量,所以连一条从b到a,容量为f,费

CCF(管道清洁):最小费用最大流

管道清洁 201812-5 需要清洁的管道下界为1, 不需要清洁的管道下界为0, 可重复经过的管道上界为正无穷, 不可重复经过的管道上界为1. 这属于无源无汇的有容量下界的最小费用可行流.解决的方法就是首先增加一个源点和一个汇点,然后对每一条有下限的弧进行改造,改成容量下限为0,上限为c-b的一条弧,再增加两条分别从x点指向源点的上限为b的弧,以及从源点指向y点的上限为b的弧. 最后,只需要求改造后的s-t的最小费用流就行了.但是当且仅当附加弧满载时候原网络有可行流. #include<iost

POJ 3686.The Windy&#39;s 最小费用最大流

The Windy's Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5477   Accepted: 2285 Description The Windy's is a world famous toy factory that owns M top-class workshop to make toys. This year the manager receives N orders for toys. The ma

P3381 【模板】最小费用最大流

P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含四个正整数ui.vi.wi.fi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi),单位流量的费用为fi. 输出格式: 一行,包含两个整数,依次为最大流量和在最大流量情况下的

C++之路进阶——最小费用最大流(支线剧情)

F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  hyxzc Logout 捐赠本站 Notice:由于本OJ建立在Linux平台下,而许多题的数据在Windows下制作,请注意输入.输出语句及数据类型及范围,避免无谓的RE出现. 3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 542  Solved: 332[Submit

hdu 4494 Teamwork 最小费用最大流

Teamwork Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4494 Description Some locations in city A has been destroyed in the fierce battle. So the government decides to send some workers to repair these location