#1081 : 最短路径·一 hihocoder dijstra http://ideone.com/H6g4MS

dijstra 顺带回顾下      http://ideone.com/H6g4MS

dijstra:  n点 m边 起点s 终点t  平均每个点m/n条边

1 遍历n找到  未使用的 距离起点最近的点p     O(n) 开始的时候p=s dist[p]=0

2 如果p为终点,输出dist[p]作为结果。      O(1)

3 用p更新与p距离最近的n个点   O(m/n)

4 标记p为已经使用的点 回到步骤1      O(1)

1~4最多循环O(n)次

开销O(nn)

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <map>
#include <queue>
using namespace std;
struct Node
{
	int location;
	int distance;
	bool operator <(const Node &other)
	{
		return distance<other.distance;
	}
}node;
int dist[100100];
int used[100100]={0};

int main() {
	memset(dist,0x0f,sizeof(dist));
	vector<pair<int ,int>> que_n[100100];
	int n,m,s,t;
	cin>>n>>m>>s>>t;
	s--;
	t--;
	int t1,t2,t3;
	for(int i=0;i<m;i++)
	{
		cin>>t1>>t2>>t3;
		que_n[t1-1].push_back(make_pair(t2-1,t3));
		que_n[t2-1].push_back(make_pair(t1-1,t3));
	}

	dist[s]=0;
	int unused_p=s;
	while(true)
	{
		if(unused_p==t)
		{
			cout<<dist[t]<<endl;
			break;
		}
		used[unused_p]=1;
		for(int i=0;i<que_n[unused_p].size();i++)
		{
			int ttt = que_n[unused_p][i].first;
			int disss = que_n[unused_p][i].second;
			dist[ttt]=min(dist[ttt], dist[unused_p]+disss);
		}
		int mindis=100000000;
		for(int i=0;i<n;i++)
		{
			if(used[i]==0&&dist[i]<mindis)
			{
				mindis = dist[i];
				unused_p = i;
			}
		}
	}
	// your code goes here
	return 0;
}
时间: 2024-10-12 14:49:25

#1081 : 最短路径·一 hihocoder dijstra http://ideone.com/H6g4MS的相关文章

Hihocoder #1081 最短路径一 dijkstra

#1081 : 最短路径·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一天——他们决定去闯鬼屋! 在鬼屋门口排上了若干小时的队伍之后,刚刚进入鬼屋的小Hi和小Ho都颇饥饿,于是他们决定利用进门前领到的地图,找到一条通往终点的最短路径. 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点

hihoCoder - 1081 - 最短路径&#183;一 (dijkstra算法!!)

#1081 : 最短路径·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一天--他们决定去闯鬼屋! 在鬼屋门口排上了若干小时的队伍之后,刚刚进入鬼屋的小Hi和小Ho都颇饥饿,于是他们决定利用进门前领到的地图,找到一条通往终点的最短路径. 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点

hihocoder(1081)最短路径1

Dijkstra,基础题,借此题好好地复习了之前的算法,Dijkstra是贪心算法的最好例子. 总结一下,Dijkstra算法是将顶点分为两组,一组S表示已经找到最短路径的顶点集合,一组Q表示还未确定是最短路径的顶点集合,维护一个D[n]的数组来记录顶点src到每个顶点的最短路径,该数组在算法完成之前或到达目标顶点前所保存的只是当前情况下的最短路径,当算法完成跳出循环后,D[i]代表点src到点i的最短距离. 算法的过程就是不断更新D[n]数组的过程,首先初始化D[n]为无限大,并将起点src加

hihoCoder#1081 最短路径&#183;一

原题地址 Dijkstra算法,甚至都不用优化(堆或优先队列)即可过 代码: 1 #include <iostream> 2 #include <vector> 3 #include <set> 4 #include <cstring> 5 6 using namespace std; 7 8 #define MAX_POINT 1024 9 #define MAX_EDGE 16384 10 11 int N, M, S, T; 12 int graph[

# 1089 最短路径&#183;二:Floyd算法 hihocoder http://ideone.com/R8ixAH

floyd算法回顾         http://ideone.com/R8ixAH 只需要一个矩阵保持最短距离: 假设n各节点. 1  枚举每个节点t 作为中间节点,也称作松弛节点   O(n) { 2  枚举每个开始节点i  O(n) {        3 枚举每个结束结束节点j    O(n) { 判断当前已知的i到j的距离是否比经过t节点长,如果是,修改ij距离.O(1) } } 开销是O(n*n*n) #include<iostream> #include<vector>

hihoCoder - 1089 - 最短路径&#183;二:Floyd算法 (floyd算法!!)

#1089 : 最短路径·二:Floyd算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的中午,小Hi和小Ho在吃过中饭之后,来到了一个新的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路. 由于没有肚子的压迫,小Hi和小Ho决定好好的逛一逛这个鬼屋,逛着逛着,小Hi产生了这样的问题:鬼屋中任意两个地点之间的最短路径是多少呢? 提示:其实如果你开心

团体程序设计天梯赛-练习集 L2-1. 紧急救援 Dijstra单源最短路径拓展应用

L2-1. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队. 输入格式: 输入第一行给出4个正整数N.M.S.D,其中N(2<

hihoCoder - 1093 - 最短路径&#183;三:SPFA算法 (SPFA)

#1093 : 最短路径·三:SPFA算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路. 不过这个鬼屋虽然很大,但是其中的道路并不算多,所以小Hi还是希望能够知道从入口到出口的最短距离是多少? 提示:Super Programming Festiv

#1093 : 最短路径&#183;三:SPFA算法 hihocoder SPFA

spfa 就是加了一个剪枝(忽略了不需要考虑的节点) 1.起点加入队列   O(1) 2.取队列中距离起点最近的点i    O(1) or O(1)  =  O(1) 2.1判断i是否为终点  如果是 结束   O(1) 2.2判断i是否值得进一步计算(当前i到起点距离是已知i到起点距离中最小的)      O(1) or O(1)  =  O(1) 2.2.1如果不值得 返回2      O(1) 2.2.2如果值得 记录当前距离为最小距离并继续     O(1) 3.遍历i的相邻节点j.