2313 星际竞速

2010年省队选拔赛山东

 时间限制: 3 s
 空间限制: 128000 KB
 题目等级 : 大师 Master

题目描述  Description

10 年一度的银河系赛车大赛又要开始了。作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的梦想,来自杰森座 α星的悠悠也是其中之一。

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

输入描述  Input Description

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

输出描述  Output Description

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

样例输入  Sample Input

3 3 
1 100 100 
2 1 10 
1 3 1 
2 3 1

样例输出  Sample Output

12

数据范围及提示  Data Size & Hint

对于 30%的数据 N≤20,M≤50; 
对于 70%的数据 N≤200,M≤4000; 
对于100%的数据N≤800, M≤15000。输入数据中的任何数都不会超过106
。 
输入数据保证任意两颗行星之间至多存在一条航道,且不会存在某颗行星到
自己的航道。

题解:

拆点,最小费用最大流。将源点与所有点拆出来的连边,费用为a[i],与原来的点连连边,花费为0.将拆出来的点与所有的汇点连边,费用为0,将路径的起点与路径终点拆出来的点相连,花费权值。

代码:

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 #define maxn 10065
  8 #define inf 0x7fffffff
  9
 10 using namespace std;
 11
 12 int head[maxn],dis[maxn],a[maxn],cnt=1,from[maxn],n,m,inq[maxn],ans,T;
 13
 14 struct ss
 15    {
 16        int to;
 17        int next;
 18        int from;
 19        int v;
 20        int c;
 21    }e[3000005];
 22
 23 void add(int u,int v,int w,int c)
 24    {
 25        e[++cnt].next=head[u];
 26        head[u]=cnt;
 27        e[cnt].c=c;
 28        e[cnt].v=w;
 29        e[cnt].from=u;
 30        e[cnt].to=v;
 31    }
 32
 33 void insert(int u,int v,int w,int c)
 34    {
 35        add(u,v,w,c);
 36        add(v,u,0,-c);
 37    }
 38
 39 bool spfa()
 40    {
 41         for (int i=0;i<=T;i++) dis[i]=inf;
 42         queue<int>que;
 43         que.push(0);
 44         inq[0]=1;
 45         dis[0]=0;
 46         while (!que.empty())
 47             {
 48                 int now=que.front();
 49                 que.pop();
 50                 for (int i=head[now];i;i=e[i].next)
 51                    if (e[i].v&&dis[e[i].to]>dis[now]+e[i].c)
 52                        {
 53                               dis[e[i].to]=dis[now]+e[i].c;
 54                               from[e[i].to]=i;
 55                               if (!inq[e[i].to])
 56                                   inq[e[i].to]=1,que.push(e[i].to);
 57                        }
 58                 inq[now]=0;
 59             }
 60         if (dis[T]!=inf) return 1;
 61          else return 0;
 62    }
 63
 64 void mcf()
 65    {
 66         int x=inf;
 67         for (int i=from[T];i;i=from[e[i].from])
 68                x=min(x,e[i].v);
 69         for (int i=from[T];i;i=from[e[i].from])
 70             {
 71                 e[i].v-=x;
 72                 e[i^1].v+=x;
 73                 ans+=e[i].c*x;
 74             }
 75    }
 76
 77 int main()
 78    {
 79         scanf("%d%d",&n,&m);
 80         T=2*n+1;
 81         for (int i=1;i<=n;i++) scanf("%d",&a[i]);
 82         for (int i=1;i<=n;i++)
 83             {
 84                 insert(0,i,1,0);
 85                 insert(i+n,T,1,0);
 86                 insert(0,i+n,1,a[i]);
 87             }
 88         for (int i=1;i<=m;i++)
 89            {
 90               int u,v,w;
 91            scanf("%d%d%d",&u,&v,&w);
 92            if (u>v) swap(u,v);
 93            insert(u,v+n,1,w);
 94            }
 95
 96        while (spfa())
 97        mcf();
 98        printf("%d\n",ans);
 99        return 0;
100    }

转载于:https://www.cnblogs.com/grhyxzc/p/5191335.html

C++之路进阶——codevs2313(星际竞速)相关推荐

  1. bzoj1927: [Sdoi2010]星际竞速

    跟上一题几乎一样... #include<cstdio> #include<cstring> #include<iostream> #include<algo ...

  2. P2469 [SDOI2010]星际竞速

    P2469 [SDOI2010]星际竞速 题意: 有n个点,m个边,边是单向边(只能从小编号点到大编号点),你也可以花费ai直接到达点i.问将1~n所有点都经过一边最小费用是多少? 题解: 最小费用最 ...

  3. (费用流)洛谷P2469 [SDOI2010]星际竞速

    洛谷P2469 [SDOI2010]星际竞速 思路: 可以看出这是最小路径覆盖问题,最小路径覆盖=n−=n-=n−最大匹配数.所以这题就是最小费用最大流. 建图: 1.源点SSS向每个入点iii建(S ...

  4. 音视频开发成长之路—进阶之路3个重要知识点丨WebRTC丨FFmpeg丨SRS流媒体服务器丨C++音视频丨嵌入式音视频

    音视频开发成长之路-进阶之路3个重要知识点 视频讲解如下,点击观看: 音视频开发成长之路-进阶之路3个重要知识点丨WebRTC丨FFmpeg丨SRS流媒体服务器丨C++音视频丨嵌入式音视频 音视频高级 ...

  5. 【BZOJ 1927】 [Sdoi2010]星际竞速

    Description 10 年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一, 夺得这个项目的冠军无疑是很多人的梦想,来自杰森座 α星的悠悠也是其中之一. 赛车大赛的赛场由 N 颗行星和 ...

  6. BZOJ1927 [Sdoi2010]星际竞速

    标签:费用流,网络流 题目 题目传送门 Description 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的 梦想,来自杰森座α星的悠悠也是其中之 ...

  7. Java成神之路-进阶步骤(转)

    https://www.hollischuang.com/archives/3280 一.基础篇 面向对象 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 平台无关性 Jav ...

  8. bzoj 1927: [Sdoi2010]星际竞速

    题意: 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的 梦想,来自杰森座α星的悠悠也是其中之一.赛车大赛的赛场由N颗行星和M条双向星际航路构成,其中 ...

  9. bzoj1927 [Sdoi2010]星际竞速 费用流

    Description 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大的活动之一,夺得这个项目的冠军无疑是很多人的 梦想,来自杰森座α星的悠悠也是其中之一.赛车大赛的赛场由N颗行星和M条双向星 ...

最新文章

  1. python绘制正态分布曲线
  2. C语言结构体值复制与字符数组值复制的比较测试
  3. Linux DNS服务配置与管理详解
  4. html viewer.app,HTML Viewer studio classroom
  5. 日语过级 JLPT简介
  6. 推荐使用typora
  7. 日志文件记录的重要性
  8. android listview item按钮,android-listview适配器中的按钮
  9. ASP.NET 2.0 Page的执行顺序
  10. 点击一下就射击的java代码_Java面向对象(6) —— 射击小游戏
  11. php起点小说小偷程序,PHP 简单的小偷程序
  12. 转:java工程师成神之路
  13. nginx中upstream的max_conns属性使用
  14. sata接口 图解 定义_SATA定义及接口
  15. 5.计算圆周长和面积的c代码
  16. [AutoVue开发手册]第二篇——AutoVue之Applet参数列表
  17. Ubuntu22.04点击.appimage软件不运行
  18. 第七节:通信之WLAN(信道)
  19. 零基础,史上最通俗视频编码技术入门
  20. 固定资产设备管理系统(移动+PC)

热门文章

  1. PHP:案例2--商品价格计算(案例分析+设计思路+知识点讲解+源码+结果展示)
  2. beamer中block样式修改
  3. 半导体 ,p型和n型半导体的区别
  4. U递是一款App软件 和滴滴打车一样性质
  5. java安装出现向导中断,在Macromedia Dreamweaver 8 完整安装之前向导已中断的解决办法...
  6. 雨课堂知识点总结(十四)
  7. 第九篇《颅骨穿孔——后篇》
  8. Android-掷骰子
  9. 群策群力:传智“小马”齐过河——成都传智播客校园新闻
  10. Entity层、DAO层、Service层、Controller层 先后顺序