1. 时间:0.25s
    空间:4m

题意:

  1. 其实就是求无环第K短路。

输入:

  1. 给出nmk,分别代表,n个点,m条边,第k长路。
  2. 接下来m行,三个整数xyz,分别代表xy之间有条费用为x的双向路。保证没有重边。

输出:

  1. 第一行两个数ab,第k小费用a,和经过的点的个数b
  2. 接下来b个数,代表第k短的路径。

Sample Input

  1. 5 10 3
  2. 1 2 6
  3. 1 3 13
  4. 1 4 18
  5. 1 5 35
  6. 2 3 14
  7. 2 4 34
  8. 2 5 17
  9. 3 4 22
  10. 3 5 15
  11. 4 5 34
  12. 1 5

Sample Output

  1. 35 2
  2. 1 5

  1. Solution
    k短路的算法,基本都是A*,这里的数据量比较小,可以采用二分答案。
    二分路径的长度,DFS求出有多少条路径的长度小于它,如果是(k-1)的话直接输出。
  2. PS:sgu在这一题上数据似乎出了问题,很多人都PE没法AC,我试着提交别人AC过的代码还是pe
    因此代码没有AC,但对程序的正确性有把握。
  3. 参考代码:
  1. #include <cstdio>
  2. const int INF = 111;
  3. int g[INF][INF], vis[INF], path[INF];
  4. int n, m, k, x, y, z, l, r, mid, leSum;
  5. int S, T, pd, len, tol;
  6. void dfs (int x, int dis) {
  7. vis[x] = 1;
  8. if (x == T) {
  9. if (dis < mid) leSum++;
  10. if (!pd && dis == mid) leSum++, pd = 1;
  11. }
  12. else
  13. for (int i = 1; i <= n; i++)
  14. if (!vis[i] && g[x][i] && dis + g[x][i] <= mid)
  15. dfs (i, dis + g[x][i]);
  16. vis[x] = 0;
  17. }
  18. int check (int x) {
  19. pd = leSum = 0;
  20. dfs (S, 0);
  21. return leSum;
  22. }
  23. int getPath (int x, int dis) {
  24. vis[x] = 1;
  25. if (x == T && dis == len) {
  26. path[++tol] = x;
  27. return pd = 1;
  28. }
  29. else
  30. for (int i = 1; i <= n; i++) {
  31. if (!vis[i] && g[x][i] && g[x][i] + dis <= len) {
  32. if (getPath (i, dis + g[x][i]) ) path[++tol] = x;
  33. if (pd) return 1;
  34. }
  35. }
  36. vis[x] = 0;
  37. }
  38. int Search () {
  39. while (l <= r) {
  40. mid = l + (r - l >> 1);
  41. int tem = check (mid);
  42. if (tem == k)
  43. return mid;
  44. else if (tem > k)
  45. r = mid - 1;
  46. else l = mid + 1;
  47. }
  48. return -1;
  49. }
  50. int main() {
  51. scanf ("%d %d %d", &n, &m, &k);
  52. for (int i = 1; i <= m; i++) {
  53. scanf ("%d %d %d", &x, &y, &z);
  54. g[x][y] = g[y][x] = z, r += z;
  55. }
  56. scanf ("%d %d", &S, &T);
  57. len = Search();
  58. pd = tol = 0;
  59. getPath (S, 0);
  60. printf ("%d %d\n", len, tol);
  61. for (int i = tol; i > 1; i--)
  62. printf ("%d ", path[i]);
  63. printf("%d\n",path[1]);
  64. return 0;
  65. }

  

  1.  

  

  1.  

SGU 145.Strange People(无环K短路)的更多相关文章

  1. 【10.9校内练习赛】【搜索】【2-sat】【树链剖分】【A_star k短路】【差分约束+判负环】

    在洛谷上复制的题目! P3154 [CQOI2009]循环赛 题目描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入输出格式 输入格式: 第一行包含 ...

  2. bellman-ford算法求K短路O(n*m),以及判负环O(n*m)

    #include<iostream> #include<algorithm> #include<cstring> using namespace std; cons ...

  3. javascript实现有向无环图中任意两点最短路径的dijistra算法

    有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://w ...

  4. 【K短路】牛慢跑

    牛慢跑 据说是\(k\)短路模板,要用\(A^*\),然而我不会.我是用拓扑排序加堆优化广搜水过去的.第一道完全靠自己做出来的紫题,调了两个小时,交了两遍.果然我还是太菜了. 正解的话,可以看红太阳的 ...

  5. JavaScript + SVG实现Web前端WorkFlow工作流DAG有向无环图

    一.效果图展示及说明 (图一) (图二) 附注说明: 1. 图例都是DAG有向无环图的展现效果.两张图的区别为第二张图包含了多个分段关系.放置展示图片效果主要是为了说明该例子支持多段关系的展现(当前也 ...

  6. POJ 2449 Remmarguts' Date --K短路

    题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...

  7. 第k短路

    poj 2449 模板题  A*+spfa #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  8. 【拓扑】【宽搜】CSU 1084 有向无环图 (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1804 题目大意: 一个有向无环图(DAG),有N个点M条有向边(N,M<=105 ...

  9. bzoj 1598: [Usaco2008 Mar]牛跑步 [k短路 A*] [学习笔记]

    1598: [Usaco2008 Mar]牛跑步 题意:k短路 ~~貌似A*的题目除了x数码就是k短路~~ \[ f(x) = g(x) + h(x) \] \(g(x)\)为到达当前状态实际代价,\ ...

随机推荐

  1. 如何将Java源代码文件的编码从GBK转为UTF-8?

    有时候看到有意思的demo,在头痛导入项目的编码和workspace的编码不一样的时候 我试着将 笔记本打开一个类一个类的复制, demo的类比较少的时候 可以忍受,demo的类多的时候 除了靠之外 ...

  2. 有关DOM的小总结

    一直以为DOM(文档对象模型)是JS中最简单的一部分.不可否认,它确实很简单,因为DOM的思维模式有点固定,只需要简单地记住一些固定的方法,所以DOM可以说是所有js(这里指的是客户端的js)入门的起 ...

  3. leetcode 最大矩形和

    1.枚举法(超时) public class Solution { public int largestRectangleArea(int[] height) { int max=-1; for(in ...

  4. BZOJ1057 [ZJOI2007]棋盘制作(极大化思想)

    1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 1848  Solved: 936 [Submit][Sta ...

  5. 《University Calculus》-chape12-偏导数-基本概念

    偏导数本质上就是一元微分学向多元函数的推广. 关于定义域的开域.闭域的推广: 其实这个定义本质上讲的就是xoy面上阴影区域的最外面的一周,只不过这里用了更加规范的数学语言. 二次函数的图形.层曲线(等 ...

  6. 实现自己的脚本语言ngscript之四:代码生成

    最近的进度 ngscript测试代码 function c1(a, b, c, d) { this.a = 1; this.b = new array(); this.b[0] = 1; this.b ...

  7. java 判断是不是检查性异常

    /** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeExcepti ...

  8. Shtirlits - SGU 125(搜索)

    题目大意:B[i, j]表示周围有多少个比它大的数,能否用B数组构造出一个A数组,如果不能输出“NO SOLUTION”. 分析:数据规模比较小,可以直接暴力枚举每个点的值. 代码如下: #inclu ...

  9. leetcode-1 Two Sum 找到数组中两数字和为指定和

     问题描写叙述:在一个数组(无序)中高速找出两个数字,使得两个数字之和等于一个给定的值.如果数组中肯定存在至少一组满足要求. <剑指Offer>P214(有序数组) <编程之美& ...

  10. 高级性能调试手段(oprofile+gprofile)+内核追踪手段:LTT

    http://blog.csdn.net/wlsfling/article/details/5876134http://www.lenky.info/archives/2012/03/1371http ...