敢问路在何方 最短路径Dijkstra算法实现

敢问路在何方

Time Limit:1000MS  Memory Limit:65536K
Total Submit:   Accepted:   

Description

在ICPC网络赛进行的如火如荼之际,有一件事一直困扰着CCB。因为在ZQU,CCB所在的C栋公寓与计算机实验大楼分别位于学校对角的两个点,每次比完赛都得拖着疲惫的身躯,忍受着饥饿的煎熬回到C栋,一个月5场网络赛下来,那还得了?这段距离对于拥有庞大身躯的CCB来说,简直是折磨。所以CCB想知道,从C栋出发到实验楼,再从实验楼回到宿舍,最省时的路线是多久?

由于CCB得忙着研究算法,所以他将这个难题交给了你。为了帮助CCB脱离苦海,请帮他算出往返于C栋与实验楼的最短时间。

注意:由于ZQU位处北岭山下,路有上下坡之分,所以A~B的时间与B~A的时间不一定相同。

Input

本题有多个测试案例,每个案例第一行为n m。( 0 < n , m < 20 )
n表示为点的个数,点1为C栋公寓,点n为实验大楼。m表示路的数量。
接下来有m行,格式为x y t,x表示路的起点,y表示路的终点,t为从x到y得花时间t。(t < 100)

Output

每个案例,输出往返于C栋与实验大楼的最短时间。

Sample Input

2 2
1 2 13
2 1 33
4 6
1 2 10
2 1 60
1 3 20
3 4 10
2 4 5
4 1 50

 

Sample Output

46
65

 

Source

肇庆学院第二届校赛

 

#include<iostream>
using namespace std;
int map[25][25];//记录通路
int dis[25];    //存每次要比较的点
int n;
int used[25];
//两个函数分别是求1到n和n到1的最短路径的Dijkstra算法
int Dijkstra_went()  //from NOCOW
{
 int i,j,k;
 for(i=1;i<=n;i++)
  dis[i] = map[1][i];
 
 for(i=1;i<n;i++)
 {
  int tmin = 0x1f1f1f1f;
  for(j=1;j<=n;j++)
   if( !used[j] && tmin > dis[j] )
   {
    tmin = dis[j];
    k = j;   
   }
   used[k] = 1;
   for(j=1;j<=n;j++)
    if( dis[k] + map[k][j] < dis[j] )
     dis[j] = dis[k] + map[k][j];
 }
// for(i=1;i<=n;i++)
// printf("%d ",dis[i]);
// printf("/n");
 return dis[n];
}
int Dijkstra_back()
{
 int i,j,k;
 for(i=1;i<=n;i++)
  dis[i] = map[n][i];
 
 for(i=2;i<=n;i++)
 {
  int tmin = 0x1f1f1f1f;//intmax
  for(j=1;j<=n;j++)
   if( !used[j] && tmin > dis[j] )
   {
    tmin = dis[j];
    k = j;   
   }
   used[k] = 1;
   for(j=1;j<=n;j++)
    if( dis[k] + map[k][j] < dis[j] )
     dis[j] = dis[k] + map[k][j];
 }
// for(i=1;i<=n;i++)
// printf("%d ",dis[i]);
// printf("/n");
 return dis[1];
}
int main()
{
 int m;
 int x,y,t;
 int sum;
 while(scanf("%d%d",&n,&m)!=EOF)            
 {
  sum=0;
  memset(map,0x1f1f1f1f,sizeof(map));
  memset(dis,0,sizeof(dis));
  memset(used,0,sizeof(used));
  while(m--) //读入通路
  {
   scanf("%d%d%d",&x,&y,&t);
   map[x][y]=t;
  }
//     for(int i=1;i<=n;i++)
//  {
//  for(int j=1;j<=n;j++)
//   printf("%d ",map[i][j]);
//  printf("/n");
//  }
  sum=Dijkstra_went();
  memset(dis,0,sizeof(dis));
  memset(used,0,sizeof(used));
  sum+=Dijkstra_back();
  printf("%d/n",sum);
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值