最短路(杭电oj2544)(迪杰斯特拉)

最短路

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 34170    Accepted Submission(s): 14833

Problem Description

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

Input

输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。

输入保证至少存在1条商店到赛场的路线。

Output

对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间

Sample Input

2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0

Sample Output

3
2

Source

UESTC 6th Programming Contest Online

#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 100000
int road[102][102],n;
int vis[102],dij[102];
void Dij(int x)
{
	int i,j,v,k,ans;
	for(i=1;i<=n;i++)
	{
	    dij[i]=road[x][i];
	    vis[i]=0;
	}
	dij[x]=0;
	vis[x]=1;
	for(i=1;i<=n;i++)
	{
		ans=N;
		for(j=1;j<=n;j++)
		{
			if(!vis[j]&&dij[j]<ans)
			{
				ans=dij[j];
				v=j;
			}
		}
		vis[v]=1;
		for(k=1;k<=n;k++)
		{
			if(!vis[k])
			   dij[k]=min(dij[k],dij[v]+road[v][k]);
		}
	}
}
int main()
{
	int m,i,j,k,t,s;
	while(scanf("%d%d",&n,&m)&&(m+n))
	{
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=n;j++)
			{
				if(i==j)
				    road[i][j]=road[j][i]=0;
				else
				    road[i][j]=road[j][i]=N;
			}
		}
		for(i=1;i<=m;i++)
		{
			scanf("%d%d%d",&k,&t,&s);
		    road[k][t]=road[t][k]=s;
		}
		Dij(1);
		printf("%d\n",dij[n]);
	}
	return 0;
}
时间: 2024-10-13 19:00:46

最短路(杭电oj2544)(迪杰斯特拉)的相关文章

hdu 2544 最短路 题解 (dijkstra/迪杰斯特拉算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 这道题用dijkstra模板一套就出来了. 模板:http://blog.csdn.net/xdz78/article/details/47719849 需要注意的是,这里的边应该是双向边,所以在输入边的数据的时候应该这样写: for(i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); g.map[a][b]=g.map[b]

普里姆算法,克鲁斯卡尔算法,迪杰斯特拉算法,弗洛里德算法

做数据结构的课程设计顺便总结一下这四大算法,本人小白学生一枚, 如果总结的有什么错误,希望能够告知指正 普里姆算法如图所示prim 找出最短的边,再以这条边构成的整体去寻找与之相邻的边,直至连接所有顶点,生成最小生成树,时间复杂度为O(n2) 克鲁斯卡尔算法如图所示kruskal 克鲁斯卡尔算法,假设连通网N=(N,{E}),则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点 自成一个连通分量.在E中选择代价最小的边,若该边依附的定顶点落在T中不同的连通分量上,

【其它】LJX的迪杰斯特拉算法报告

迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2.然后我们分别看每条路的权值,发现1-6的权值为14,记录下来.1-3的权值为9,记录下来.1-2的权值为7,记录下来.我们发现好像不能再从1号节点发现什么了,所以,我们把它out掉. 接着按顺序看2号节点,从节点2发出了2条路分别是2-3与2-4,我们接着向计算1号节点一样计算2号节点.先计算2-3

最短路 迪杰斯特拉.cpp

<span style="color:#3333ff;">#include<stdio.h> #include<stdlib.h> #define INITITY 999//最大值 #define VERTEX 20//最多顶点个数 #define FALSE 0 #define TURE 1 #define size 30 #define OVERFLOW -1 typedef struct ArcCell{ int adj;//权值类型 }Arc

dijkstra(迪杰斯特拉)最短路算法的堆优化

dijkstra(迪杰斯特拉)最短路算法是一种时间复杂度经过严格证明的最短路算法. 优化在于每次取最小值的时候采用堆优化,但是在最短路松弛过程中,dist是不断修改的,所以,为了能使复杂度降到O(nlogn),dist修改的同时,在堆中也要修改. 注意dijkstra(迪杰斯特拉)最短路算法只能用于正权边. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algo

HDU 2544最短路 (迪杰斯特拉算法)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 83843    Accepted Submission(s): 36272 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-sh

图论,最短路,堆优化迪杰斯特拉

学习了迪杰斯特拉. 类似贪心. 也有点像弗洛伊德. 上代码. 这种是规定了起始节点为1的. 1 #include <cstdio> 2 #include <iostream> 3 #include <string> 4 #include <bits/stdc++.h> 5 6 using namespace std; 7 #define MAXN 10001 8 #define MAXM 100001 9 10 //n点m边 11 12 struct edg

bfs输出路径 &amp;&amp; 最短路(迪杰斯特拉)输出路径

问题描述 解决方法 1.像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现 2.换乘次数最少,那就用bfs广搜来寻找答案.但是我的代码不能保证这个最少换乘是最短路程 代码 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #include<queue> 6 #include<vector> 7 using

最短路之Dijkstra(迪杰斯特拉)

一般用法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等.重点----->>>>注意该算法要求图中不存在负权边. 问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径.(单源最短路径

pat1003 迪杰斯特拉法和dfs求最短路

本题的背景是求定点和定点之间的最短路问题,方法手段来自数据结构课程中的迪杰斯特拉算法和dfs(深度优先遍历). 分别用两种方法编程如下代码 dfs #include <iostream> #include <cstring> #include <cstdio> using namespace std; #define maxv 510 bool visit[maxv]; int arc[maxv][maxv];//邻接矩阵 int M,N,C1,C2; //M总顶点数,