题目链接:点击查看

题目大意:给出一张 n 个点的有向图,每条边都有边权,现在要求将每条边至少遍历一遍,问最小的边权为多少

题目分析:建图时将每条边都设置流量为 [ 1 , inf ] ,就变成最小费用可行流了

最小费用可行流:

建图方法:

  1. 建立超级源点 st 和超级汇点 ed,原图源点 s 和原图汇点 t
  2. 对于原边 ( u , v , cost , l , r ) ,建立新边 ( u , v , cost , r - l )
  3. 记录入度 du[ i ]
    1. 如果 du[ i ] > 0:连边 ( st , i , 0 , du[ i ] )
    2. 如果 du[ i ] < 0:连边 ( i , ed , 0 , -du[ i ] )
  4. 连边 ( t , s , 0 , inf )

答案即为 st -> ed 的最小费用最大流 + 原图中下界 * 边的费用

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=310;//点const int M=N*N;//边int du[N];//入度struct Edge
{int to,w,cost,next;
}edge[M];int head[N],cnt;void addedge(int u,int v,int w,int cost)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].cost=cost;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;edge[cnt].cost=-cost;edge[cnt].next=head[v];head[v]=cnt++;
}void add(int u,int v,int w,int lower,int upper)
{addedge(u,v,upper-lower,w);du[u]-=lower,du[v]+=lower;
}int d[N],incf[N],pre[N];bool vis[N];bool spfa(int s,int t)
{memset(d,inf,sizeof(d));memset(vis,false,sizeof(vis));memset(pre,-1,sizeof(pre));queue<int>q;q.push(s);vis[s]=true;incf[s]=inf;d[s]=0;while(!q.empty()){int u=q.front();q.pop();vis[u]=false;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;int cost=edge[i].cost;if(!w)continue;if(d[v]>d[u]+cost){d[v]=d[u]+cost;pre[v]=i;incf[v]=min(incf[u],w);if(!vis[v]){vis[v]=true;q.push(v);}}}}return pre[t]!=-1;
}int update(int s,int t)
{int x=t;while(x!=s){int i=pre[x];edge[i].w-=incf[t];edge[i^1].w+=incf[t];x=edge[i^1].to;}return d[t]*incf[t];
}void init()
{memset(head,-1,sizeof(head));cnt=0;
}int solve(int st,int ed)
{int ans=0;while(spfa(st,ed))ans+=update(st,ed);return ans;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);init();int st=N-1,ed=st-1;int n;scanf("%d",&n);int ans=0;for(int i=1;i<=n;i++){int k;scanf("%d",&k);while(k--){int to,t;scanf("%d%d",&to,&t);add(i,to,t,1,inf);ans+=t;}}for(int i=2;i<=n;i++)addedge(i,1,inf,0);for(int i=1;i<=n;i++){if(du[i]>0)addedge(st,i,du[i],0);elseaddedge(i,ed,-du[i],0);}ans+=solve(st,ed);printf("%d\n",ans);return 0;
}

洛谷 - P4043 [AHOI2014/JSOI2014]支线剧情(最小费用可行流)相关推荐

  1. 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)

    题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...

  2. P4043 [AHOI2014/JSOI2014]支线剧情(有源汇上下界最小费用可行流)

    传送门 约束每个点至少要经过一次,因此是上下界网络流. 每经过边都需要相应的边权,且要求耗费边权之和最小,因此是最小费用流. 存在多个终点,需要建立汇点 ttt ,因此是有源汇网络流. 即:有源汇上下 ...

  3. 洛谷 P4016 负载平衡问题 【最小费用最大流】

    求出平均数sum,对于大于sum的点连接(s,i,a[i]-sum,0),表示这个点可以流出多余的部分,对于小于sum的点连接(i,t,sum-a[i],0)表示这个点可以接受少的部分,然后每个点向相 ...

  4. [AHOI2014/JSOI2014]支线剧情

    [AHOI2014/JSOI2014]支线剧情 有n个剧情点,对于第i个剧情点有ki个分支,分别通往tij剧情点,耗费时间为bij.从1号点开始,可以从任何节点返回1号点,要遍历所有的边的最少耗费时间 ...

  5. 有下界的最小费用可行流2.0(bzoj 3876: [Ahoi2014]支线剧情)

    什么是有下界的最小费用可行流? 平时来讲都是最小费用最大流,也就是在满流的前提条件下费用尽可能的少,而最小费用可行流一般不要求满流,但是每条边都有最小流量要求(比如经过边e(u,v)的流量不能少于4等 ...

  6. 题解 洛谷 P4042 [AHOI2014/JSOI2014]骑士游戏

    洛谷P4042[AHOI2014/JSOI2014]骑士游戏\color{#00F}{洛谷\ P4042\ [AHOI2014/JSOI2014]骑士游戏}洛谷 P4042 [AHOI2014/JSO ...

  7. 有上下限的最小费用可行流

    例题 BZOJ 3876 题意,有N个点,并且有一些边,每个点必须要经过一次,但是不限经过次数,也就是有下界的情况,且下界为1,现在每次的起点都是1,问至少花费的代价,使得每次从1开始,终点不限的情况 ...

  8. 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)

    题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai​,ai+n​一个点为入点,一个为出点这条边的流量范围 ...

  9. 【最小费用可行流模板】

    可能再也用不到了吧,今天整理电脑文件看到的,作为图论选手,留个纪念, //原图: 对于pi,拆点xi,yi s->S,[m,m],0 S->xi,[0,inf],0 yi->t,[0 ...

最新文章

  1. 双网卡双ip实现双线路共用
  2. 微信公众平台开发教程(八)Session处理
  3. Windows系统版本判断
  4. Redis整合Spring结合使用缓存实例
  5. 人生有五不:不等、不管、不看、不做、不给
  6. LeetCode 130. 被围绕的区域(图的BFS/DFS)
  7. maven安装过程以及手动添加jar包到本地仓库
  8. 阿甘修理机器人cd_剑网三遗失的美好奖励之阿甘
  9. MySQL高级 —— 查询性能优化
  10. 嵌入式C/C++开发过程中日志输出的一点思考
  11. 八种常用的排序算法(转)
  12. react 使用cookie react-cookies
  13. ubuntu 20.04上配置 QT_ROS的插件
  14. IOS中如何显示带有html标签的富文本
  15. python求两坐标距离_如何使用Python已知两坐标求距离?
  16. 软件测试 | 状态迁移法
  17. 【STM32F407的DSP教程】第2章 Matlab R2018a的安装
  18. 给闪讯加装路由器的一个简单方法
  19. 规格说明书练习-吉林市1日游
  20. 从远景论坛上学到的完美激活NERO8 NERO9的经验

热门文章

  1. mysql 多数据库实例_Mysql多实例安装
  2. MySQL高级 - 日志 - 查询日志
  3. MySQL查看索引使用情况
  4. MySQL 高级 循环获取游标
  5. The pc Register(程序计数器)
  6. zookeeper的设计猜想-leader选举
  7. 策略模式在JDK 源码中的体现
  8. 依赖版本控制-pom文件介绍
  9. 搭建eureka注册中心
  10. SHA1 - Java加密与安全