Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。

 
Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
 
Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
 
Sample Input
3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
 
Sample Output
2 -1
 
 dijkstra代码:
  1. #include <stdio.h>
  2. #define N 210
  3. #define INF 100000000
  4. int n, m;
  5. int vis[N], dis[N], cost[N][N];
  6. int min(int x, int y)
  7. {
  8. return x < y ? x : y;
  9. }
  10. void dijkstra(int s, int t)
  11. {
  12. int u, v;
  13. for(u = ; u < n; u++)
  14. {
  15. vis[u] = ;
  16. dis[u] = INF;
  17. }
  18. dis[s] = ;
  19. while(true)
  20. {
  21. v = -;
  22. for(u = ; u < n; u++)
  23. if(!vis[u] && (v == - || dis[u]<dis[v]))
  24. v = u;
  25. if(v == -)
  26. break;
  27. vis[v] = ;
  28. for(u = ; u < n; u++)
  29. dis[u] = min(dis[u], dis[v]+cost[v][u]);
  30. if(v == t)
  31. break;
  32. }
  33. if(dis[t] == INF)
  34. printf("-1\n");
  35. else
  36. printf("%d\n", dis[t]);
  37. return ;
  38. }
  39. int main()
  40. {
  41. int s, t;
  42. while(~scanf("%d%d", &n, &m))
  43. {
  44. //if(n<0 || n>=200 || m<0 || m>= 1000)
  45. // break;
  46. int i, j, a, b, c;
  47. for(i = ; i < n; i++)
  48. for(j = ; j < n; j++)
  49. cost[i][j] = INF;
  50. while(m --)
  51. {
  52. scanf("%d%d%d", &a, &b, &c);
  53. if(cost[a][b] > c)
  54. cost[a][b] = cost[b][a] = c;
  55. }
  56. scanf("%d%d", &s, &t);
  57. dijkstra(s, t);
  58. }
  59. return ;
  60. }

spfa代码:

  1. #include <stdio.h>
  2. #include <queue>
  3. #include <string.h>
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. int n, m, cnt, t;
  7. int vis[], used[], dis[];
  8. int head[];
  9. struct node
  10. {
  11. int from, to, val, next;
  12. }edge[];
  13. int add(int x, int y, int z)
  14. {
  15. edge[cnt].from = x;
  16. edge[cnt].to = y;
  17. edge[cnt].val = z;
  18. edge[cnt].next = head[x];
  19. head[x] = cnt++;
  20. }
  21. void spfa(int s)
  22. {
  23. priority_queue <int> q;
  24. memset(vis, , sizeof(vis));
  25. memset(dis, INF, sizeof(dis));
  26. memset(used, , sizeof(used));
  27. vis[s] = ;
  28. dis[s] = ;
  29. q.push(s);
  30. while(!q.empty())
  31. {
  32. int x = q.top();
  33. q.pop();
  34. vis[x] = ;
  35. for(int i = head[x]; i != -; i = edge[i].next)
  36. {
  37. int y = edge[i].to;
  38. if(dis[y] > dis[x]+edge[i].val)
  39. {
  40. dis[y] = dis[x]+edge[i].val;
  41. q.push(y);
  42. vis[y] = ;
  43. used[y]++;
  44. if(used[y] > n)
  45. return ;
  46. }
  47. }
  48. }
  49. if(q.empty())
  50. {
  51. if(dis[t]==INF)
  52. printf("-1\n");
  53. else
  54. printf("%d\n", dis[t]);
  55. }
  56. return ;
  57. }
  58. int main()
  59. {
  60. int s, a, b, x;
  61. while(~scanf("%d%d", &n, &m))
  62. {
  63. cnt = ;
  64. memset(head, -, sizeof(head));
  65. while(m--)
  66. {
  67. scanf("%d%d%d", &a, &b, &x);
  68. add(a, b, x);
  69. add(b, a, x);
  70. }
  71. scanf("%d%d", &s, &t);
  72. spfa(s);
  73. }
  74. return ;
  75. }

floyd算法:

  1. #include <stdio.h>
  2. #define INF 0x3f3f3f3f
  3. #define N 210
  4. int dis[N][N];
  5. int n, m;
  6. void init()
  7. {
  8. for(int i = ; i < n; i++)
  9. for(int j = ; j < n; j++)
  10. if(j == i)
  11. dis[i][j] = ;
  12. else
  13. dis[i][j] = INF;
  14. }
  15. void floyd()
  16. {
  17. for(int k = ; k < n; k++)
  18. for(int i = ; i < n; i++)
  19. {
  20. if(dis[i][k] != INF)
  21. {
  22. for(int j = ; j < n; j++)
  23. if(dis[i][j] > dis[i][k] + dis[k][j])
  24. dis[i][j] = dis[i][k] + dis[k][j];
  25. }
  26. }
  27. }
  28. int main()
  29. {
  30. int a, b, x;
  31. while(~scanf("%d%d", &n, &m))
  32. {
  33. init();
  34. while(m--)
  35. {
  36. scanf("%d%d%d", &a, &b, &x);
  37. if(dis[a][b] > x)
  38. dis[a][b] = dis[b][a] = x;
  39. }
  40. floyd();
  41. int s, t;
  42. scanf("%d%d", &s, &t);
  43. if(dis[s][t] != INF)
  44. printf("%d\n", dis[s][t]);
  45. else
  46. printf("-1\n");
  47. }
  48. return ;
  49. }

hdoj 1874 畅通工程续的更多相关文章

  1. hdoj 1874 畅通工程续【dijkstra算法or spfa算法】

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. hdoj 1874 畅通工程续(单源最短路+dijkstra)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 思路分析:该问题给定一个无向图.起始点和终点,要求求出从起始点到终点的最短距离: 使用Dijks ...

  3. ACM: HDU 1874 畅通工程续-Dijkstra算法

    HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Desc ...

  4. hdu 1874 畅通工程续

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过 ...

  5. HDU 1874畅通工程续(迪杰斯特拉算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)     ...

  6. HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题

    参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上:  迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...

  7. hdu 1874 畅通工程续 Dijkstra

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目分析:输入起点和终点,顶点的个数,已连通的边. 输出起点到终点的最短路径,若不存在,输出-1 ...

  8. HDU 1874 畅通工程续【Floyd算法实现】

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...

随机推荐

  1. VS2015 Android

    最近安装了VS2015,体验了一下android 的开发,按模板创建运行了个,试下效果很不错.也可以可视化设计.但昨天再次打开或创建一个android程序后,设计界面直接不能显示,显示错误:(可能是升 ...

  2. Ubuntu中启用关闭Network-manager网络设置问题!

    Ubuntu中启用关闭Network-manager网络设置问题! [Server版本] 在UbuntuServer版本中,因为只存有命令行模式,所以要想进行网络参数设置,只能通过修改/etc/net ...

  3. lisp 题目

    1.根据二叉树的中序,前序生成生成二叉树的后续 2.BFPRT算法

  4. [winserver]设置Server2008R2远程桌面允许每个用户运行多个会话

    首先打开"服务器管理器",选择"角色"-在对话框右边部分选择"添加角色" 根据提示一步步安装即可. 然后在角色中找到"远程桌面服务 ...

  5. writel(readl(&pwm_timer->tcfg0) | 0xff, &pwm_timer->tcfg0);

    解析这句代码什么意思! 神说:选定预分频器0 为什么? 神说:因为实验中选的是timer1,在预分频器0下: 若选择timer4,该如何写这句代码? 首先看tcfg0中选择预分频器1,在看tcfg1里 ...

  6. Java中的字符串常量池

    ava中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new ...

  7. 通过WinForm控件创建的WPF控件无法输入的问题

    今天把写的一个WPF程序发布到别的机器上执行,发现一个比较奇怪的问题:在那个机器上用英文输入法无法输入数字,非要切换到中文输入法才行:但在我的机器上却是好好的. 最开始以为是输入法的问题,弄了好一阵子 ...

  8. uniq,sort,

    语 法:uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]   补充说明: ...

  9. Jmeter外部函数引用

    Jmeter外部函数引用 1.Beanshell引用Jmeter变量 添加用户自定义变量,输入变量名称和变量值,添加Debug sampler,用于输出初始变量值.

  10. Hibernate对象的状态

    站在持久化的角度, Hibernate 把对象分为 4 种状态: 1. 持久化状态 2. 临时状态 3. 游离状态 4. 删除状态 Session 的特定方法能使对象从一个状态转换到另一个状态. 下面 ...