点我看题目

题意 :中文不详述。

思路 :因为这个题加了一个要求就是路径数目得是x的倍数。所以在原来算法的一维dis数组增加到二维,用来存走的路径数%x。也可以用spfa做。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <iostream>
  5.  
  6. using namespace std ;
  7.  
  8. #define LL long long
  9. const int maxn = ;
  10. const int maxm = ;
  11. bool vis[maxn][maxn] ;
  12. const LL INF = 1LL<< ;
  13. int cnt = ;
  14. int head[maxn] ;
  15. LL dist[maxn][maxn] ;
  16. int n , m ;
  17.  
  18. struct node
  19. {
  20. int u,v,w ;
  21. int next ;
  22. }Edge[maxm] ;
  23.  
  24. void addedge(int u,int v,int w)
  25. {
  26. Edge[cnt].u = u ;
  27. Edge[cnt].v = v ;
  28. Edge[cnt].w = w ;
  29. Edge[cnt].next = head[u] ;
  30. head[u] = cnt++ ;
  31. }
  32.  
  33. LL dijkstra(int s,int t,int x)
  34. {
  35. for(int i = ; i < n ; i++)
  36. for(int j = ; j < x ; j++)
  37. {
  38. dist[i][j] = INF ;
  39. vis[i][j] = false ;
  40. }
  41. dist[s][] = ;
  42. while(true)
  43. {
  44. LL minn = INF ;
  45. int u = - ;
  46. int flag , xx ;
  47. for(int i = ; i < n ; i++)
  48. {
  49. for(int j = ; j < x ; j++)
  50. {
  51. if(!vis[i][j] && minn > dist[i][j])
  52. {
  53. minn = dist[i][j] ;
  54. u = i ;
  55. flag = j ;
  56. xx = (flag+)%x ;
  57. }
  58. }
  59. }
  60. if(u == -) return - ;
  61. vis[u][flag] = true ;
  62. if(vis[t][]) return dist[t][] ;
  63. for(int j = head[u] ; j != - ; j = Edge[j].next)
  64. {
  65. int v = Edge[j].v ;
  66. if(!vis[v][xx] && minn + Edge[j].w < dist[v][xx])
  67. dist[v][xx] = minn + Edge[j].w ;
  68. }
  69. }
  70. }
  71. int main()
  72. {
  73. int T,s,t,x ;
  74. scanf("%d",&T) ;
  75. while(T--)
  76. {
  77. cnt = ;
  78. memset(head,-,sizeof(head)) ;
  79. // memset(vis,false,sizeof(vis) ) ;
  80. scanf("%d %d",&n,&m) ;
  81. int u,v, w ;
  82. for(int i = ; i < m ; i++)
  83. {
  84. scanf("%d %d %d",&u,&v,&w) ;
  85. addedge(u,v,w) ;
  86. }
  87. scanf("%d %d %d",&s,&t,&x) ;
  88. LL ans = dijkstra(s,t,x) ;
  89. if(ans != -)
  90. printf("%lld\n",dist[t][]) ;
  91. else printf("No Answer!\n") ;
  92. }
  93. return ;
  94. }

SDUT 2622 最短路径(Dijkstra)的更多相关文章

  1. 最短路径 dijkstra

    最短路径 dijkstra #include <stdio.h> #include <string.h> #include <limits.h> #define M ...

  2. 网络最短路径Dijkstra算法

    最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...

  3. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  4. 单源最短路径Dijkstra算法,多源最短路径Floyd算法

    1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...

  5. 最短路径——Dijkstra算法和Floyd算法

    Dijkstra算法概述 Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图(无 ...

  6. 最短路径-Dijkstra算法与Floyd算法

    一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2   ADCE:3   ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...

  7. 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms           Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  8. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  9. 有向网络(带权的有向图)的最短路径Dijkstra算法

    什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...

随机推荐

  1. poj 1182 食物链(关系并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 62824   Accepted: 18432 Description ...

  2. EL表达式简单应用

    <%@page import="java.util.HashMap"%> <%@page import="java.util.List"%&g ...

  3. Ehcache - hello world

    Key Classes CacheManager The CacheManager class is used to manage caches. Creation of, access to, an ...

  4. 一般处理程序生成简单的图片验证码并通过html验证用户输入的验证码是否正确

    一般处理程序生成简单的图片验证码并通过html验证用户输入的验证码是否正确       最近没事研究了下验证码的的动态生成及通过cookie实现HTML页面对用户输入的验证码的校验,简要如下: 1.写 ...

  5. C语言对文件的相关命令

    fopen(文件名,使用文件的方式):打开数据文件 fclose(FILE *fp):关闭数据文件 feof(FILE *fp):是判断是否到fp的结尾 fputc(char ch,FILE *fp) ...

  6. items 与iteritems

    dict的items函数返回的是键值对的元组的列表,而iteritems使用的是键值对的generator. items当使用时会调用整个列表 iteritems当使用时只会调用值. >> ...

  7. SQLserver数据库基础

    1·控制数据库的服务 运行 cmd 在控制面板输入  net  start   MSSQLserver   (启动数据库服务) 在控制面板输入  net  stop   MSSQLserver   ( ...

  8. 总结&记录

    一.Git(linux命令) 1.tar  压缩/解压 -c 建立一个压缩文件(create) -x 解压一个压缩文件 -t 查看tarfile中文件 -z 是否具有gzip的属性?是否需要用gzip ...

  9. 关于四字节字符入库时错误的解决方案(Incorrect string value: '\xF0\x9F\x99\x8F' for column 'Reply_Content' at row 1)

    1. 将表字段字符集设置成utf8mb4 2. 执行插入前执行:SET NAMES utf8mb4; 如: SET NAMES utf8mb4; INSERT test(Content) VALUES ...

  10. shell 数组

    数组赋值:(1) array=(var1 var2 var3 ... varN)(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)(3) array ...