华师一附中OI组

标题: Dijkstra方法求最短路径 [打印本页]

作者: diggersun    时间: 2015-11-1 23:44
标题: Dijkstra方法求最短路径
本帖最后由 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. }
复制代码



作者: diggersun    时间: 2015-11-1 23:45
变形还是很多的,比如,求次短的路径。




欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2