题意:在这个寒假中,鲍勃有计划在山区度假胜地滑雪。这个滑雪胜地有M个不同的滑雪道和N个不同的标志位于那些转弯处点。从第S标记到第T标志的第i路径具有长度L。每个路径必须遵循降低高度的原则,起点必须严格高于终点。 现在,你应该帮助鲍勃找到最长的滑雪道。

思路:因为说起点必须严格高于终点,所以是一个有向图,而且不可能存在环,可以看作是一个DAG模型, 求DAG上的最长路可以用dp来求,有些时候也可以看作AOE网,这样就可以用拓扑排序来求关键路径来解决了;

代码:

  1. #include<algorithm>
  2.  
  3. #include<iostream>
  4.  
  5. #include<cstring>
  6.  
  7. #include<cstdio>
  8.  
  9. #include<queue>
  10.  
  11. using namespace std;
  12.  
  13. #define MP make_pair
  14.  
  15. const int N = + ;
  16.  
  17. const int INF = 0x3f3f3f3f;
  18.  
  19. vector<pair<int, int> > edge[N];
  20.  
  21. class Topological{
  22.  
  23. private:
  24.  
  25. int tot = , vis[N], n;
  26.  
  27. queue<int> Q;
  28.  
  29. public:
  30.  
  31. int in[N], dist[N], topo[N];
  32.  
  33. void Init(int n){
  34.  
  35. this -> n = n;
  36.  
  37. for(int i = ; i <= n; ++ i)
  38.  
  39. vis[i] = , dist[i] = - INF;
  40.  
  41. }
  42.  
  43. bool Topo_Sort(){ //拓扑排序
  44.  
  45. for(int i = ; i <= n; ++ i){
  46.  
  47. if(in[i] == ){
  48.  
  49. Q.push( i );
  50.  
  51. vis[i] = true;
  52.  
  53. dist[i] = ;
  54.  
  55. topo[tot++] = i;
  56.  
  57. }
  58.  
  59. }
  60.  
  61. while(!Q.empty()){
  62.  
  63. int u = Q.front(); Q.pop();
  64.  
  65. for(int i = edge[u].size() - ; i >= ; -- i){
  66.  
  67. int v = edge[u][i].first;
  68.  
  69. -- in[v];
  70.  
  71. if(in[v] == && !vis[v]){
  72.  
  73. vis[v] = true;
  74.  
  75. Q.push( v );
  76.  
  77. topo[tot++] = v;
  78.  
  79. }
  80.  
  81. }
  82.  
  83. }
  84.  
  85. return tot == n ? true : false;
  86.  
  87. }
  88.  
  89. int Get_Cpm(){ //求关键路径
  90.  
  91. for(int i = ; i < tot; ++ i){
  92.  
  93. int u = topo[i];
  94.  
  95. for(int j = edge[u].size() - ; j >= ; -- j){
  96.  
  97. int v = edge[u][j].first;
  98.  
  99. int c = edge[u][j].second;
  100.  
  101. if(dist[v] < dist[u] + c) dist[v] = dist[u] + c;
  102.  
  103. }
  104.  
  105. }
  106.  
  107. int ans = ;
  108.  
  109. for(int i = ; i <= n; i++)
  110.  
  111. if(dist[i] > ans) ans = dist[i];
  112.  
  113. return ans;
  114.  
  115. }
  116.  
  117. }Topo;
  118.  
  119. void Input_data(int &n, int &m){
  120.  
  121. int u, v, c;
  122.  
  123. scanf("%d %d", &n, &m);
  124.  
  125. Topo.Init( n );
  126.  
  127. for(int i = ; i <= m; ++ i){
  128.  
  129. scanf("%d %d %d", &u, &v, &c);
  130.  
  131. edge[u].push_back(MP(v, c));
  132.  
  133. ++ Topo.in[v];
  134.  
  135. }
  136.  
  137. }
  138.  
  139. int main(){
  140.  
  141. int T, n, m;
  142.  
  143. scanf("%d", &T);
  144.  
  145. while(T --){
  146.  
  147. Input_data(n, m);
  148.  
  149. Topo.Topo_Sort();
  150.  
  151. printf("%d\n", Topo.Get_Cpm());
  152.  
  153. for(int i = ; i <= n; ++ i) edge[i].clear();
  154.  
  155. }
  156.  
  157. }

2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing的更多相关文章

  1. Skiing 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题(拓扑序求有向图最长路)

    参考博客(感谢博主):http://blog.csdn.net/yo_bc/article/details/77917288 题意: 给定一个有向无环图,求该图的最长路. 思路: 由于是有向无环图,所 ...

  2. HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)

    HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: ...

  3. 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H Skiing【拓扑排序,关键路径】

    2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛  H Skiing In this winter holiday, Bob has a plan for skiing at the moun ...

  4. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 M. Frequent Subsets Problem【状态压缩】

    2017 ACM-ICPC 亚洲区(南宁赛区)网络赛  M. Frequent Subsets Problem 题意:给定N和α还有M个U={1,2,3,...N}的子集,求子集X个数,X满足:X是U ...

  5. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  6. ICPC 2018 徐州赛区网络赛

    ACM-ICPC 2018 徐州赛区网络赛  去年博客记录过这场比赛经历:该死的水题  一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进.     D. Easy Math 题意:   ...

  7. 【2017 ACM/ICPC 乌鲁木齐赛区网络赛环境测试赛 E】蒜头君的排序

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] 莫队算法+树状数组. 区间增加1或减少1. 对逆序对的影响是固定的. (用冒泡排序变成升序的交换次数,就是逆序对的个数) [错的次数] 0 [ ...

  8. 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing (拓扑排序+假dp)

    题目链接:https://nanti.jisuanke.com/t/16957 题目: In this winter holiday, Bob has a plan for skiing at the ...

  9. 2017 ACM-ICPC(乌鲁木齐赛区)网络赛 H.Skiing 拓扑排序+最长路

    H.Skiing In this winter holiday, Bob has a plan for skiing at the mountain resort. This ski resort h ...

随机推荐

  1. Vue成员与指令介绍

    一.Vue介绍 1.什么是vue 通过对框架的了解与运用程度,来决定其在整个项目中的应用范围, 可以独立完成前后端分离式web项目的渐进式JavaScript框架 2.为什么要学vue 三大主流框架之 ...

  2. ubuntu E: Could not get lock /var/lib/apt/lists/lock 异常信息

    转载:https://www.cnblogs.com/qq952693358/p/6537846.html 在更换软件源时遇到了如下问题: sudo apt-get update E: Could n ...

  3. Spring boot之JPA

    JPA 步骤: (1)在pom.xml添加mysql,spring-data-jpa依赖 (2)在application.properties文件中配置mysql连接配置文件 (3)在applicat ...

  4. 设置Google浏览器不缓存JS

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  5. day8_文件操作及编码解码

    一.文件操作基本流程 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所 ...

  6. IJCAI 2019 Analysis

    IJCAI 2019 Analysis 检索不到论文的关键词:retrofitting word embedding Getting in Shape: Word Embedding SubSpace ...

  7. golang tcp keepalive实践

    前文中已经介绍了TCP keep alive的做了详尽说明,本文结合golang,介绍如何使用TCP keep alive. 目前golang net包不提供TCP keep alive 空闲多长时间 ...

  8. flutter 隐藏返回按钮 自定义返回按钮

    自定义返回按钮 //改变颜色 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: BackBu ...

  9. linux(centOS7)的基本操作(三) 用户、组、权限管理

    用户和组 1.用户.组.家目录的概念 linux系统支持多用户,除了管理员,其他用户一般不应该使用root,而是应该向管理员申请一个账号.组类似于角色,系统可以通过组对有共性的用户进行统一管理.每个用 ...

  10. oracle 12 安装

    oracle 12 第二版本安装 下载地址  https://www.oracle.com/technetwork/cn/middleware/webcenter/content/downloads/ ...