hihoCoder - 1081 - 最短路-dijkstra算法

描述

万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一天——他们决定去闯鬼屋!

在鬼屋门口排上了若干小时的队伍之后,刚刚进入鬼屋的小Hi和小Ho都颇饥饿,于是他们决定利用进门前领到的地图,找到一条通往终点的最短路径。

鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路。那么小Hi和小Ho至少要走多少路程才能够走出鬼屋去吃东西呢?

提示:顺序!顺序才是关键。
输入

每个测试点(输入文件)有且仅有一组测试数据。

在一组测试数据中:

第1行为4个整数N、M、S、T,分别表示鬼屋中地点的个数和道路的条数,入口(也是一个地点)的编号,出口(同样也是一个地点)的编号。

接下来的M行,每行描述一条道路:其中的第i行为三个整数u_i, v_i, length_i,表明在编号为u_i的地点和编号为v_i的地点之间有一条长度为length_i的道路。

对于100%的数据,满足N<=10^3,M<=10^4, 1 <= length_i <= 10^3, 1 <= S, T <= N, 且S不等于T。

对于100%的数据,满足小Hi和小Ho总是有办法从入口通过地图上标注出来的道路到达出口。

输出

对于每组测试数据,输出一个整数Ans,表示那么小Hi和小Ho为了走出鬼屋至少要走的路程。

Sample Input
5 23 5 4
1 2 708
2 3 112
3 4 721
4 5 339
5 4 960
1 5 849
2 5 98
1 4 99
2 4 25
2 1 200
3 1 146
/*
 *               ii.                                         ;9ABH,            
 *              SA391,                                    .r9GG35&G            
 *              &#ii13Gh;                               i3X31i;:,rB1           
 *              iMs,:,i5895,                         .5G91:,:;:s1:8A           
 *               33::::,,;5G5,                     ,58Si,,:::,sHX;iH1          
 *                Sr.,:;rs13BBX35hh11511h5Shhh5S3GAXS:.,,::,,1AG3i,GG          
 *                .G51S511sr;;iiiishS8G89Shsrrsh59S;.,,,,,..5A85Si,h8          
 *               :SB9s:,............................,,,.,,,SASh53h,1G.         
 *            .r18S;..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,....,,.1H315199,rX,         
 *          ;S89s,..,,,,,,,,,,,,,,,,,,,,,,,....,,.......,,,;r1ShS8,;Xi         
 *        i55s:.........,,,,,,,,,,,,,,,,.,,,......,.....,,....r9&5.:X1         
 *       59;.....,.     .,,,,,,,,,,,...        .............,..:1;.:&s         
 *      s8,..;53S5S3s.   .,,,,,,,.,..      i15S5h1:.........,,,..,,:99         
 *      93.:39s:rSGB@A;  ..,,,,.....    .SG3hhh9G&BGi..,,,,,,,,,,,,.,83        
 *      G5.G8  9#@@@@@X. .,,,,,,.....  iA9,.S&B###@@Mr...,,,,,,,,..,.;Xh       
 *      Gs.X8 S@@@@@@@B:..,,,,,,,,,,. rA1 ,A@@@@@@@@@H:........,,,,,,.iX:      
 *     ;9. ,8A#@@@@@@#5,.,,,,,,,,,... 9A. 8@@@@@@@@@@M;    ....,,,,,,,,S8      
 *     X3    iS8XAHH8s.,,,,,,,,,,...,..58hH@@@@@@@@@Hs       ...,,,,,,,:Gs     
 *    r8,        ,,,...,,,,,,,,,,.....  ,h8XABMMHX3r.          .,,,,,,,.rX:    
 *   :9, .    .:,..,:;;;::,.,,,,,..          .,,.               ..,,,,,,.59    
 *  .Si      ,:.i8HBMMMMMB&5,....                    .            .,,,,,.sMr   
 *  SS       :: h@@@@@@@@@@#; .                     ...  .         ..,,,,iM5   
 *  91  .    ;:.,1&@@@@@@MXs.                            .          .,,:,:&S   
 *  hS ....  .:;,,,i3MMS1;..,..... .  .     ...                     ..,:,.99   
 *  ,8; ..... .,:,..,8Ms:;,,,...                                     .,::.83   
 *   s&: ....  .sS553B@@HX3s;,.    .,;13h.                            .:::&1   
 *    SXr  .  ...;s3G99XA&X88Shss11155hi.                             ,;:h&,   
 *     iH8:  . ..   ,;iiii;,::,,,,,.                                 .;irHA    
 *      ,8X5;   .     .......                                       ,;iihS8Gi  
 *         1831,                                                 .,;irrrrrs&@  
 *           ;5A8r.                                            .:;iiiiirrss1H  
 *             :X@H3s.......                                .,:;iii;iiiiirsrh  
 *              r#h:;,...,,.. .,,:;;;;;:::,...              .:;;;;;;iiiirrss1  
 *             ,M8 ..,....,.....,,::::::,,...         .     .,;;;iiiiiirss11h  
 *             8B;.,,,,,,,.,.....          .           ..   .:;;;;iirrsss111h  
 *            i@5,:::,,,,,,,,.... .                   . .:::;;;;;irrrss111111  
 *            9Bi,:,,,,......                        ..r91;;;;;iirrsss1ss1111  
 *            代码无BUG!!!
 */
#include <stdio.h>
#include <string.h>
#define MAXN 1005
int N,M,S,T;
int map[MAXN][MAXN],dis[MAXN],vis[MAXN];
int mintwo(int x,int y)
{
	return x<y?x:y;
}
void dikjstra(int S)
{
	for (int i = 1; i <=N; ++i)
		dis[i]=map[S][i];
	vis[S]=1;
	dis[S]=0;
	for (int i = 1; i < N; ++i)
	{
		int pos;
		int min=0x7f7f7f7f;
		for(int j=1;j<=N;j++)
		{
			if(vis[j]==0&&dis[j]<min)
			{
				min = dis[pos=j];
			}
		}
		if(min==0x7f7f7f7f)
			break;			//如果是没有路径,他就不在返回了
		vis[pos]=1;
		for(int k=1;k<=N;k++)
		{
			if(vis[k]==0&&map[pos][k]+dis[pos]<dis[k])
			dis[k]=map[pos][k]+dis[pos];
		}
		//printf("%d   %d\n",pos,dis[pos]);
	}
}


int main(int argc, char const *argv[])
{
	while(scanf("%d%d%d%d",&N,&M,&S,&T)==4&&N&&M)
	{
		memset(vis,0,sizeof(vis));
		//memset(dis,1<<7,sizeof(dis));
		memset(map,0x7f,sizeof(map));
		for (int i = 1; i <= M; ++i)
		{
			int n1,n2,m;
			scanf("%d %d %d",&n1,&n2,&m);
			map[n1][n2]=map[n2][n1]=mintwo(map[n2][n1],m);
		}
		dikjstra(S);
		printf("%d\n", dis[T]);
	}	
	return 0;	
}

3 2 1061 4 8604 1 7955 4 4795 4 2803 4 3411 4 6224 2 3622 3 4154 1 9042 1 7162 5 575
Sample Output
123

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值