华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1329|回复: 1
打印 上一主题 下一主题

Dijkstra方法求最短路径

[复制链接]

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
跳转到指定楼层
楼主
发表于 2015-11-1 23:44:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 diggersun 于 2016-3-9 15:19 编辑

经典的贪心方法,或者叫启发式广度优先搜索,尽管现在人们更喜欢SPFA,但是还是了解一下它吧。TYVJ1031 热浪,经典的题目,我的做法:
  1. #include <iostream>
  2. using namespace std;
  3. int g[2600][2600];
  4. bool flag[2600];
  5. int rount[2600];
  6. int T, C, Ts, Te, rs, re, ci;
  7. int FindMin()//找所有的未标号的顶点中路径的最小值
  8. {
  9.     int Min,Temp,i;
  10.     Min=999999999;
  11.     for (i=1; i<=T; i++)
  12.         if ((!flag[i]) &&(rount[i]<Min))
  13.         {
  14.             Temp=i;
  15.             Min=rount[i];
  16.         }
  17.     return Temp;
  18. }
  19. int main()
  20. {

  21.     int i,j,k;
  22.     int shortest;
  23.     cin >> T >> C >> Ts >> Te;
  24.     for (i=1; i<=T; i++)
  25.     {
  26.         rount[i]=999999999;
  27.         for (j=i; j<=T; j++)
  28.             g[i][j]=g[j][i]=999999999;
  29.     }
  30.     for (i = 1; i <= C; i++)
  31.     {
  32.         cin >> rs >> re >> ci;
  33.         if (ci<g[rs][re]) g[rs][re]= g[re][rs] = ci;
  34.     }
  35.     flag[Ts]=1;
  36.     i=Ts;//从第一顶点开始
  37.     rount[i]=0;
  38.     do
  39.     {
  40.         shortest=99999999;
  41.         for (j=1; j<=T; j++)
  42.             if (!flag[j])   //本点没有被标号
  43.                 if (rount[j]>rount[i]+g[i][j])
  44.                     rount[j]=rount[i]+g[i][j];
  45.         i=FindMin();
  46.         flag[i]=1;
  47.     }
  48.     while (!flag[Te]);
  49.     cout<<rount[Te];
  50.     return 0;
  51. }
复制代码


回复

使用道具 举报

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
沙发
 楼主| 发表于 2015-11-1 23:45:08 | 只看该作者
变形还是很多的,比如,求次短的路径。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 06:37 , Processed in 0.097915 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表