即求从起点到终点至少走K条路的最短路径。

用两个变量来维护一个点的dis,u和e,u为当前点的编号,e为已经走过多少条边,w[u][e]表示到当前点,走过e条边的最短路径长度,因为是至少K条边,所以大于K条边的当做K条边来处理就好了。求最短路的三个算法都可以做,我这里用的是SPFA,比较简洁。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <map>
  8. #include <queue>
  9. #define Mod 1000000007
  10. using namespace std;
  11. #define N 5007
  12.  
  13. vector<pair<int,int> > G[N];
  14. int w[N][],inq[N][];
  15. int s,t,n,m,k,res;
  16. struct node
  17. {
  18. int u,e;
  19. node(int _u,int _e)
  20. {
  21. u = _u;
  22. e = _e;
  23. }
  24. node(){}
  25. };
  26.  
  27. void SPFA(int s)
  28. {
  29. int u,v,e,i,j,len;
  30. for(i=;i<=n;i++)
  31. {
  32. for(j=;j<=;j++)
  33. {
  34. w[i][j] = Mod;
  35. inq[i][j] = ;
  36. }
  37. }
  38. queue<node> que;
  39. res = Mod;
  40. while(!que.empty())
  41. que.pop();
  42. w[s][] = ;
  43. inq[s][] = ;
  44. que.push(node(s,));
  45. while(!que.empty())
  46. {
  47. node tmp = que.front();
  48. que.pop();
  49. u = tmp.u;
  50. e = tmp.e;
  51. if(u == t && e == k)
  52. res = min(w[u][e],res);
  53. inq[u][e] = ; //释放
  54. int ka;
  55. if(e+ > k)
  56. ka = k;
  57. else
  58. ka = e+;
  59. for(i=;i<G[u].size();i++)
  60. {
  61. v = G[u][i].first;
  62. len = G[u][i].second;
  63. if(w[v][ka] > len + w[u][e])
  64. {
  65. w[v][ka] = len + w[u][e];
  66. if(!inq[v][ka])
  67. {
  68. inq[v][ka] = ;
  69. que.push(node(v,ka));
  70. }
  71. }
  72. }
  73. }
  74. }
  75.  
  76. int main()
  77. {
  78. int u,v,wi,i,j;
  79. while(scanf("%d%d",&n,&m)!=EOF)
  80. {
  81. for(i=;i<=;i++)
  82. G[i].clear();
  83. while(m--)
  84. {
  85. scanf("%d%d%d",&u,&v,&wi);
  86. G[u].push_back(make_pair(v,wi));
  87. G[v].push_back(make_pair(u,wi));
  88. }
  89. scanf("%d%d%d",&s,&t,&k);
  90. SPFA(s);
  91. if(res == Mod)
  92. puts("-1");
  93. else
  94. printf("%d\n",res);
  95. }
  96. return ;
  97. }

UESTC 915 方老师的分身II --最短路变形的更多相关文章

  1. UESTC_方老师的分身 II CDOJ 915

    方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  2. UESTC 914 方老师的分身I Dijkstra

    题意:求有向图的往返最短路的最长长度. 分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来.考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果. 所以 ...

  3. UESTC 916 方老师的分身III --拓扑排序

    做法: 如果有a<b的关系,则连一条a->b的有向边,连好所有边后,找入度为0的点作为起点,将其赋为最小的价值888,然后其所有能到的端点,价值加1,加入队列,删去上一个点,然后循环往复, ...

  4. UESTC 917 方老师的分身IV --求欧拉路径

    判断欧拉路径是否存在及求出字典序最小的欧拉路径问题(如果存在). 将字符串的第一个字母和最后一个字母间连边,将字母看成点,最多可能有26个点(a-z),如果有欧拉路径,还要判断是否有欧拉回路,如果有, ...

  5. cdoj915-方老师的分身 II (长度不小于k的最短路)【spfa】

    http://acm.uestc.edu.cn/#/problem/show/915 方老师的分身 II Time Limit: 10000/5000MS (Java/Others)     Memo ...

  6. UESTC 898 方老师和缘分 --二分图匹配+强连通分量

    这题原来以为是某种匹配问题,后来好像说是强连通的问题. 做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u-> ...

  7. UESTC - 900 方老师炸弹 —— 割点

    题目链接:https://vjudge.net/problem/UESTC-900   方老师炸弹 Time Limit: 4000/2000MS (Java/Others)     Memory L ...

  8. UESTC 884 方老师的专题讲座 --数位DP

    定义:cnt[L][K]表示长度为L,最高位为K的满足条件C的个数. 首先预处理出cnt数组,枚举当前长度最高位和小一个长度的最高位,如果相差大于2则前一个加上后一个的方法数. 然后给定n,计算[1, ...

  9. UESTC 885 方老师买表 --状压DP

    将方格的摆放分成两种: 1.水平摆放:此时所占的两个格子都记为1. 2.竖直摆放:此时底下那个格子记为1,上面那个记为0. 这样的话,每行都会有一个状态表示. 定义:dp[i][s]表示考虑已经填到第 ...

随机推荐

  1. JAVA多用户商城系统源码

    最近公司要搞商城,让我多方咨询,最后看了很多,要不就是代码注释不全,要不就是bug多,要么就是文档缺少,最后决定自己开发一套商城. 下面是开发的一些心得体会,权且记录下来,给自己做个记录把.   网址 ...

  2. 【iOS】Quartz2D截屏

    一.简单说明 在程序开发中,有时候需要截取屏幕上的某一块内容,比如捕鱼达人游戏.如图: 完成截屏功能的核心代码:- (void)renderInContext:(CGContextRef)ctx;调用 ...

  3. rabbitmq队列中消息过期配置

    最近公司某个行情推送的rabbitmq服务器由于客户端异常导致rabbitmq队列中消息快速堆积,还曾导致过内存积压导致rabbitmq客户端被block的情况.考虑到行情信息从业务上来说可以丢失部分 ...

  4. Hadoop的Map侧join

    写了关于Hadoop下载地址的Map侧join 和Reduce的join,今天我们就来在看另外一种比较中立的Join. SemiJoin,一般称为半链接,其原理是在Map侧过滤掉了一些不需要join的 ...

  5. jQuery corner 圆角插件

    jquery.corner是一款强大的圆角插件(所产生的不止只是圆角效果),兼容包括IE6.IE7.IE8.firefox.Opera .Safari.Chrome等主流浏览器,唯一的缺点是为了产生边 ...

  6. 趣味题:恺撒Caesar密码(c++实现)

    描述:Julius Caesar 生活在充满危险和阴谋的年代.为了生存,他首次发明了密码,用于军队的消息传递.假设你是Caesar 军团中的一名军官,需要把Caesar 发送的消息破译出来.并提供给你 ...

  7. CSS布局——横向两列布局

    1.固定两栏布局,使用float,注意对紧邻元素清除浮动影响.IE6在使用float布局同时设置横行margin的情况下会有双边距BUG,解决方案是加入_display:inline 代码如下: &l ...

  8. 任意类型转换为IntPtr

    之前,将数组.结构体等转换为IntPtr使用的是Marshal.Copy().Marshal.StructureToPtr(),但是有个问题自定义的结构体数组没法这样转化,一般网上给出的解决方法就是通 ...

  9. Java从零开始学四十三(DOM4j解析XML)

    一.创建XML // 建立XML public static void gernatorXML() { // 创建Document对象 Document doc = DocumentHelper.cr ...

  10. iOS-申请测试证书详解(多图原创)

    申请测试证书详解 前言 App开发和发布过程中证书基础知识:1. Certification(证书)证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种:1) Developer Certifi ...