Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2877428
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-05-09 17:34:48


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

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
 
Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B再接下一行有两个整数S,T(0<=S,T
 

Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
 

Sample Input
(n,m)n个城镇,已经存在的m条路,
3 3
0 1 1
0 2 3
1 2 1
0 2(s->dist)

3 1
0 1 1
1 2

Sample Output
2
-1
总是超时!!

  1. #include <stdio.h>

  2. #define MAX 99999
  3. #define LEN 1009

  4. int map[LEN][LEN]; //某点到某点两点间的的距离
  5. int dist[LEN]; //记录当前点到源点的最短路径长度
  6. int mark[LEN]; //加入进来的点的集合

  7.  

  8.     //初始化map为正无穷大
  9.     void init()
  10.     {
  11.        int i,j;
  12.        for(i=0;i<LEN;i++)
  13.      {
  14.               for(j=0;j<LEN;j++)
  15.              {
  16.                      map[i][j]=MAX;
  17.               }
  18.        }
  19.     }

  20.     //n:多少条路 start:起始点
  21.     //dist[i],最后存储着start 到i点的最短距离
  22.     int myDijstra(int n,int start)
  23.     {
  24.        int i,j,min,pos;
  25.        for(i=0;i<=n-1;i++)
  26.      {
  27.             mark[i]=0;//没有点加入
  28.             dist[i]=map[start][i];//把start 附近点 dis[]初始化
  29.        }

  30.        mark[start]=1;//把起始点加进来
  31.        dist[start]=0;

  32.        for(i=0;i<n-1;i++)//注意i<n-1
  33.      {
  34.               min=MAX;
  35.              pos=-1;
  36.               for(j=0;j<=n-1;j++)
  37.              {
  38.                      if(!mark[j] && dist[j]<min)
  39.                      { //取出不在mark里的最小的dist[i]
  40.                          min=dist[j];
  41.                          pos=j;//标记
  42.                      }

  43.               }

  44.              //if(min==MAX)//已经不能通了
  45.              // printf("%d\n",pos);
  46.              if(pos==-1)
  47.                   return -1;

  48.                 mark[pos]=1;//把K加进来

  49.               //做松弛操作
  50.               for(j=0;j<=n-1;j++)
  51.              {
  52.                     if(!mark[j] && dist[j]>dist[pos]+map[pos][j])//start->j or start->pos,pos->j
  53.                     {
  54.                        dist[j]=dist[pos]+map[pos][j];//这步跟prim算法有点不同
  55.                     }
  56.               }
  57.         }
  58.      return 1;
  59.     }

  60.  

  61. int main()
  62. {

  63.        int i,n,line;
  64.        int a,b,d;
  65.     while(scanf("%d%d",&n,&line)!=EOF)
  66.     {
  67.         //scanf("%d%d",&n,&line);//输入点和
  68.         init();
  69.         for(i=0;i<line;i++)
  70.         {

  71.             scanf("%d%d%d",&a,&b,&d); //输入各边的权值
  72.             if(map[a][b]>d)//防止重边,(1 2 4)(1 2 5)
  73.             {
  74.             map[a][b]=map[b][a]=d;
  75.             }
  76.         
  77.             
  78.         }
  79.         int s,d;
  80.         scanf("%d%d",&s,&d);
  81.             int ans=myDijstra(n,s);//调用方法(点数,起始点)

  82.         //输出s到d的最短路径
  83.             if(ans==-1)
  84.                 printf("-1\n");    
  85.             else
  86.                 printf("%d\n",dist[d]);
  87.     

  88.     }
  89.        return 0;

  90. }

阅读(1122) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~