模板——Dijkstra

#include<bits/stdc++.h>
using namespace std;int n,m,mp[1001][1001],s[1001];
bool judge[1001]={0};
//judge表示判断点是否有用过,s[i]表示1到点i的最短路径,mp表示两点的距离int main(){
	cin>>n>>m;
	for (int i=1; i<=n; i++){
		for (int l=1; l<=n; l++){
			mp[i][l]=1e9;
		}
	}
	for (int i=1; i<=n; i++) s[i]=1e9;
	for (int i=1; i<=m; i++){
		int x,y,z;
		cin>>x>>y>>z;
		mp[x][y]=z;
	}
	for (int i=2; i<=n; i++) s[i]=mp[1][i];
	s[1]=0;
	judge[1]=true;
	for (int i=1; i<=n; i++){
		int mina=1e9,pos=0;
		for (int l=1; l<=n; l++){
			if (judge[l]==0 && mina>s[l]){
				mina=s[l];
				pos=l;
			}
		}
		if (pos==0) break;
		judge[pos]=1;
		for (int l=1; l<=n; l++){
			if (mp[pos][l]!=1e9 && s[l]>s[pos]+mp[pos][l])
				s[l]=s[pos]+mp[pos][l];
		}
	}
	cout<<s[n];
	return 0;
}
时间: 2024-11-07 22:44:13

模板——Dijkstra的相关文章

模板Dijkstra

#include <stdio.h>#define N 205#define INF 10000000 int g[N][N],bz[N],dist[N],s,t,n,m; void Dijkstra(int s){ int i,j,min,k,x; for (i=1;i<=n;i++) { dist[i]=g[s][i]; bz[i]=0; } bz[s]=1; for (i=1;i<n;i++) { min=INF; j=s; for (k=1;k<=n;k++) if

[模板]Dijkstra

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <ctime> 5 using namespace std; 6 int n, map[510][510], dis[510]; 7 bool exist[510]; 8 int dij(int x, int y){ 9 dis[x] = 0;

poj 3463 Sightseeing (dij 求最短路和次短路并计数)

dijkstra求最短路和次短路的求法和计算  模板 dijkstra求最短路的变形. 外循环要循环2*n-1次,因为dis[n][2]有2*n个状态,而dis[s][0]已经用过一次. 算法: 1.如果比最短路短就更新最短路和次短路. 2.如果和最短路相等,更新最短路的计数. 3.如果和次短路相等,更新次短路的方法数. 4.如果比次短路短,更新次短路. #include<cstdio> #include<iostream> #include<cstring> #inc

最短路径之 Dijkstra模板

一:时间复杂度为O(V*V)的Dijkstra const int Max_v = 100 + 10; const int INF = 1<<30; int cost[Max_v][Max_v];//权值 int d[Max_v];//顶点s出发最短距离 bool used[Max_v];//以使用过的图 int V;//顶点数 int Edge;//边数 void dijkstra(int s) { fill(d,d+V,INF); fill(used,used+V,false); d[s]

最短路(floyd/dijkstra/bellmanford/spaf 模板)

floyd/dijkstra/bellmanford/spaf 模板: 1. floyd(不能处理负权环,时间复杂度为O(n^3), 空间复杂度为O(n^2)) floyd算法的本质是dp,用dp[k][i][j]表示以(1....k)为中间点,i, j之间的最短距离为多少,dp[0][i][j]即为原矩阵图. dp[k][i][j]可以由dp[k-1][i][j]转移得到,即不经过 k 点i, j之间的最短距离为多少, 也可以由dp[k-1][i][k]+dp[k-1][k][j]转移得到,即

HDU 2544 最短路(我的dijkstra算法模板、SPAFA算法模板)

思路:这道题是基础的最短路径算法,可以拿来试一下自己对3种方法的理解 dijkstra主要是从第一个点开始枚举,每次枚举出当当前最小的路径,然后再以那最小的路径点为起点,求出它到其它未标记点的最短距离 bellman-ford 算法则是假设有向网中有n 个顶点.且不存在负权值回路,从顶点v1 和到顶点v2 如果存在最短路径,则此路径最多有n-1 条边.这是因为如果路径上的边数超过了n-1 条时,必然会重复经过一个顶点,形成回路:而如果这个回路的权值总和为非负时,完全可以去掉这个回路,使得v1到v

(最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍

这一篇博客以一些OJ上的题目为载体.整理一下最短路径算法.会陆续的更新... 一.多源最短路算法--floyd算法 floyd算法主要用于求随意两点间的最短路径.也成最短最短路径问题. 核心代码: /** *floyd算法 */ void floyd() { int i, j, k; for (k = 1; k <= n; ++k) {//遍历全部的中间点 for (i = 1; i <= n; ++i) {//遍历全部的起点 for (j = 1; j <= n; ++j) {//遍历

hdu 2544 单源最短路问题 dijkstra+堆优化模板

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41168    Accepted Submission(s): 17992 Problem Description 在每年的校赛里.全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的.所以如今他们想要寻

常用最短路优化算法及例题(附模板)——-SPFA和Dijkstra

常用最短路算法——-SPFA和Dijkstra及其优化 这篇文章将简单讲解两个最常用的最短路优化算法,需要读者有一定的图论基础. 首先从DIJKSTRA讲起.常规的dijkstra算法复杂度较高,为O(n^2),因为要花大量时间来找当前已知的距顶点距离最小的值,所以用优先队列(值小的先出队列)来优化,可大大优化时间复杂度.STL中优先队列的操作单次复杂度为O(logN),所以经过优先队列优化的dijkstra时间复杂度会降到O(N*logN); 以下为核心部分代码: 1 struct pack{