Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流)

Description

10年一度的银河系赛车大赛又要开始了。作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的梦想,来自杰森座α星的悠悠也是其中之一。赛车大赛的赛场由N颗行星和M条双向星际航路构成,其中每颗行星都有一个不同的引力值。大赛要求车手们从一颗与这N颗行星之间没有任何航路的天体出发,访问这N颗行星每颗恰好一次,首先完成这一目标的人获得胜利。由于赛制非常开放,很多人驾驶着千奇百怪的自制赛车来参赛。这次悠悠驾驶的赛车名为超能电驴,这是一部凝聚了全银河最尖端科技结晶的梦幻赛车。作为最高科技的产物,超能电驴有两种移动模式:高速航行模式和能力爆发模式。在高速航行模式下,超能电驴会展开反物质引擎,以数倍于光速的速度沿星际航路高速航行。在能力爆发模式下,超能电驴脱离时空的束缚,使用超能力进行空间跳跃——在经过一段时间的定位之后,它能瞬间移动到任意一个行星。天不遂人愿,在比赛的前一天,超能电驴在一场离子风暴中不幸受损,机能出现了一些障碍:在使用高速航行模式的时候,只能由每个星球飞往引力比它大的星球,否则赛车就会发生爆炸。尽管心爱的赛车出了问题,但是悠悠仍然坚信自己可以取得胜利。他找到了全银河最聪明的贤者——你,请你为他安排一条比赛的方案,使得他能够用最少的时间完成比赛。

Input

第一行是两个正整数N,M。第二行N个数A1~AN,其中Ai表示使用能力爆发模式到达行星i所需的定位时间。接下来M行,每行3个正整数ui,vi,wi,表示在编号为ui和vi的行星之间存在一条需要航行wi时间的星际航路。输入数据已经按引力值排序,也就是编号小的行星引力值一定小,且不会有两颗行星引力值相同。

Output

仅包含一个正整数,表示完成比赛所需的最少时间。

Sample Input

3 3

1 100 100

2 1 10

1 3 1

2 3 1

Sample Output

12

Http

Luogu:https://www.luogu.org/problem/show?pid=2469#sub

HYSBZ:https://vjudge.net/problem/HYSBZ-1927

Source

网络流,最小费用最大流

题目大意

有n个星球,m条从小编号到大编号的星球的单项航道,每条路径都有一个花费。另外可以通过跳跃的方法,从一个星球跳到星球u,其代价为C[u]。现在从不属于这n个星球的一个星球出发,求不重复遍历所有星球的最小代价。

解决思路

我们用最小费用最大流来解决这道问题。

对于每一个星球我们把其拆成两个点,入点和出点。我们在每一个入点和源点之间连一条代价为0,流量为1的点,在每一个出点和汇点之间同样连一条代价为0,流量为1的点,这样是为了每个点只走一次且必须走一次。

对于跳跃的情况,假设我们跳到u星球的代价是cost,那么我们在源点与u的出点连一条代价为cost,流量为1的边。

对于每一条航道u->v,代价为cost,我们在u的入点和v的出点之间连一条代价为cost,流量为1的边。

注意,在这张图中,我们连的所有边的流量都是1,这样是为了保证每一个星球只走一次。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<queue>
  7. using namespace std;
  8. const int maxN=2010;
  9. const int maxM=40001;
  10. const int inf=2147483647;
  11. class Edge
  12. {
  13. public:
  14. int u,v,cost,flow;//一条边的出发点,结束点,代价,残量
  15. };
  16. int n,m;
  17. int cnt=-1;
  18. int Head[maxN];
  19. int Next[maxM];
  20. Edge E[maxM];
  21. int dist[maxN];//spfa中0到i的代价
  22. int pre[maxN];//spfa中i点的来源边的编号
  23. int flow[maxN];//spfa中到达某点的流量
  24. bool inqueue[maxN];
  25. void Add_Edge(int u,int v,int cost,int flow);//添加边
  26. void _Add(int u,int v,int cost,int flow);
  27. bool spfa();//spfa求增广路
  28. int main()
  29. {
  30. memset(Head,-1,sizeof(Head));
  31. memset(Next,-1,sizeof(Next));
  32. scanf("%d%d",&n,&m);
  33. for (int i=1;i<=n;i++)//我们定义源点为0,汇点为n*2+1
  34. {
  35. int cost;
  36. scanf("%d",&cost);
  37. Add_Edge(0,i,0,1);//添加源点到入点的边
  38. Add_Edge(0,i+n,cost,1);//添加源点直接连到出点的边
  39. Add_Edge(i+n,n*2+1,0,1);//添加出点到汇点的边
  40. }
  41. for (int i=1;i<=m;i++)
  42. {
  43. int u,v,w;
  44. scanf("%d%d%d",&u,&v,&w);
  45. if (u>v)
  46. swap(u,v);
  47. Add_Edge(u,v+n,w,1);//添加入点到出点的边
  48. }
  49. int Ans=0;
  50. while (spfa())//spfa增广
  51. {
  52. int now=n*2+1;
  53. int last=pre[now];
  54. while (now!=0)//修改残量
  55. {
  56. E[last].flow-=flow[n*2+1];
  57. E[last^1].flow+=flow[n*2+1];
  58. now=E[last].u;
  59. last=pre[now];
  60. }
  61. Ans+=dist[n*2+1];//累计代价
  62. }
  63. cout<<Ans<<endl;
  64. return 0;
  65. }
  66. void Add_Edge(int u,int v,int cost,int flow)
  67. {
  68. _Add(u,v,cost,flow);//加正边
  69. _Add(v,u,-cost,0);//加反边
  70. }
  71. void _Add(int u,int v,int cost,int flow)
  72. {
  73. cnt++;
  74. Next[cnt]=Head[u];
  75. Head[u]=cnt;
  76. E[cnt].u=u;
  77. E[cnt].v=v;
  78. E[cnt].cost=cost;
  79. E[cnt].flow=flow;
  80. }
  81. bool spfa()//spfa求增广路
  82. {
  83. memset(pre,-1,sizeof(pre));//初始化
  84. memset(dist,127,sizeof(dist));
  85. memset(flow,0,sizeof(flow));
  86. memset(inqueue,0,sizeof(inqueue));
  87. queue<int> Q;
  88. while (!Q.empty())
  89. Q.pop();
  90. flow[0]=inf;//源点入队
  91. dist[0]=0;
  92. inqueue[0]=1;
  93. Q.push(0);
  94. do
  95. {
  96. int u=Q.front();
  97. Q.pop();
  98. inqueue[u]=0;
  99. for (int i=Head[u];i!=-1;i=Next[i])
  100. {
  101. int v=E[i].v;
  102. if ((E[i].flow>0)&&(dist[v]>dist[u]+E[i].cost))
  103. {
  104. dist[v]=dist[u]+E[i].cost;
  105. pre[v]=i;
  106. flow[v]=min(flow[u],E[i].flow);
  107. if (inqueue[v]==0)
  108. {
  109. Q.push(v);
  110. inqueue[v]=1;
  111. }
  112. }
  113. }
  114. }
  115. while (!Q.empty());
  116. if (flow[n*2+1]==0)//当汇点流量为0时,说明不存在增广路,增广结束
  117. return 0;
  118. return 1;
  119. }

Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流)的更多相关文章

  1. BZOJ 1927: [Sdoi2010]星际竞速

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2051  Solved: 1263[Submit][Stat ...

  2. 1927: [Sdoi2010]星际竞速

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2040  Solved: 1257[Submit][Stat ...

  3. BZOJ 1927: [Sdoi2010]星际竞速 费用流

    1927: [Sdoi2010]星际竞速 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  4. bzoj 1927 [Sdoi2010]星际竞速(最小费用最大流)

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1576  Solved: 954[Submit][Statu ...

  5. BZOJ 1927: [Sdoi2010]星际竞速(最小费用最大流)

    拆点,费用流... ----------------------------------------------------------------------------- #include< ...

  6. BZOJ 1927: [Sdoi2010]星际竞速 [上下界费用流]

    1927: [Sdoi2010]星际竞速 题意:一个带权DAG,每个点恰好经过一次,每个点有曲速移动到他的代价,求最小花费 不动脑子直接上上下界费用流过了... s到点连边边权为曲速的代价,一个曲速移 ...

  7. 【bzoj】1927 [Sdoi2010]星际竞速

    [算法]最小费用最大流 [题解]跟滑雪略有类似,同样因为可以重复所以不是最小路径覆盖. 连向汇的边容量为1足矣,因为一个点只会出去一次(路径结束). bzoj 1927 [Sdoi2010]星际竞速 ...

  8. Bzoj 1927: [Sdoi2010]星际竞速(网络流)

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MB Description 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大 ...

  9. 【BZOJ】1927: [Sdoi2010]星际竞速(费用流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1927 题意:n个点的无向图.m条加权边.只能从编号小的到编号大的.可以瞬移,瞬移有时间.每个点只能访 ...

随机推荐

  1. 20155233 Exp1 PC平台逆向破解(5)M

    Exp1 PC平台逆向破解(5)M 实践一 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 步骤 1.cp pwn1 pwn20155233拷贝pwn1文件,命名为pwn201 ...

  2. 20155321 《网络攻防》 Exp4 恶意代码分析

    20155321 <网络攻防> Exp4 恶意代码分析 计划任务监控 在C盘根目录下建立一个netstatlog.bat文件(先把后缀设为txt,保存好内容后记得把后缀改为bat),内容如 ...

  3. vue-cli 使用 font-awesome 字体插件

    在 cmd 中,运行:cnpm install font-awesome在 main.js 里添加import "font-awesome/css/font-awesome.css" ...

  4. WPF编程,窗体最大化、最小化、关闭按钮功能的禁用

    原文:WPF编程,窗体最大化.最小化.关闭按钮功能的禁用 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/detail ...

  5. sprintboot 和swagger2整合生成文档

    1.创建springboot 工程 2.引入maven依赖 <dependency> <groupId>io.springfox</groupId> <art ...

  6. CSS快速入门-基本选择器

    1.标签选择器 通过标签进行元素选择. <style> a { font-size:10px; color:red; } </style> 2.* *代表通配符,匹配任意标签, ...

  7. Unity 图文重现官方教程视频 2droguelike 第一集

    初衷: 本人初学Unity,四处收集了一些视频和教材,学习和摸索了一段时间, 我发现官网教程简单易上手,只不过他是英文讲解不方便,我就想把他翻译翻译吧, 然后我又发现看视频学习要暂停回放好多遍,麻烦, ...

  8. Unity XLua 官方教程学习

    一.Lua 文件加载 1. 执行字符串 using UnityEngine; using XLua; public class ByString : MonoBehaviour { LuaEnv lu ...

  9. 英国诗人乔叟Dethe is my Finaunce金融

    英国诗人乔叟Dethe is my Finaunce金融 英语中“金融”在14世纪,金融计算时间价值的手段.就随机结果签约的能力.一个允许转让金融权后的清算.<Lamentation of Ma ...

  10. oracle创建用户和角色、管理授权以及表空间操作

    show user 显示当前用户connect username/password@datebasename as sysdba 切换用户和数据库 和用户身份 Oracle登录身份有三种: norma ...