`
plussai
  • 浏览: 90695 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

单源最短路径----Dijkstra

阅读更多
    dijkstra算法个人感觉挺怪异的,不过复杂度O(n2),速度快,但是不能理解WSM很多人都推荐用FLOYD,可能是实现简单吧,但是FLOYD必须用邻接矩阵来实现。两者的功能上稍有不同,dijkstra算法对于输入的节点,能够找出该点到所有其他点的最短路径。
    基本的算法思路是,把图中的点集分为2部分,一部分为访问过的点(即已经找到了输入点到该点的最短路径),另一部分为还没访问到的点。dijkstra算法的进行过程就是把第二类点归并到第一类点的过程。
    如何归并,首先在第二类点中找到距输入点(v)距离最近的点(i),把这个点归入第一类,然后开始更新其余第二类点到输入点的距离(即如果dist[i]+cost[i][j]<dist[j],dist[j]=dist[i]+cost[i][j],cost为邻接矩阵中的权值,点j是更新的节点)。
    可以看出,没归并更新一次,第一类点就曾加一个,第二类点就少一个,那么我们初始化时将第一类点集设为空,所有的点全在第二类点集中。只需经过NUMV次归并更新操作,即可找到从输入点到所有点的最短路径。
#include<iostream>
#include<string.h>
using namespace std;
const int numv=6;
const int maxm=100000;
int dist[numv];
int path[numv];
int s[numv];
int cost[numv][numv];
int init()
{
	for(int i=0;i<numv;i++)
	{
		path[i]=-1;
		s[i]=0;
	}
	for(int i=0;i<numv;i++)
	for(int j=0;j<numv;j++)
	cost[i][j]=maxm;
	//cost[0][0]=0;
	cost[0][2]=10;
	cost[0][4]=30;
	cost[0][5]=100;
	//cost[1][1]=0;
	cost[1][2]=10;
	//cost[2][2]=0;
	cost[2][3]=50;
	//cost[3][3]=0;
	cost[3][5]=10;
	//cost[4][4]=0;
	cost[4][3]=20;
	cost[4][5]=60;
	//cost[5][5]=0;
}
void getShotpath(int v)
{
	for(int i=0;i<numv;i++)
	{
		dist[i]=cost[v][i];
		s[i]=0;
		if(cost[v][i]<maxm)
		path[i]=v;
		else
		path[i]=-1;	
	}
	s[v]=1;
	dist[v]=0;
	for(int i=0;i<numv;i++)
	{
		int min=100000;
		int flag;
		for(int j=0;j<numv;j++)
		{
			if(!s[j]&&dist[j]<min)
			{
				min=dist[j];
				flag=j;
			}	
		}
		s[flag]=1;
		//cout<<min<<endl;
		for(int j=0;j<numv;j++)
		{
			if(!s[j]&&dist[flag]+cost[flag][j]<dist[j])
			{
				dist[j]=dist[flag]+cost[flag][j];
				path[j]=flag;
			}	
		}		
	}	
}
int main()
{
	int a,b;
	while(cin>>a>>b)
	{
		if(a==b)
		cout<<"input again"<<endl;
		if(a>5||b>5)
		cout<<"input again"<<endl;
		init();
		getShotpath(a);
		cout<<"shotpath="<<dist[b]<<endl;
		int k=b;
		int pout[maxm];
		int count=0;
		while(path[k]!=-1)
		{
			pout[count]=path[k];
			k=path[k];
			++count;
		}
		for(int i=count-1;i>=0;i--)
		cout<<pout[i]<<" ";
		cout<<b<<" ";

		cout<<endl;

	}	
}
分享到:
评论

相关推荐

    用Dijkstra算法求图中单源最短路径

    "用Dijkstra算法求图中单源最短路径" Dijkstra算法是一种常用的图搜索算法,用于解决单源最短路径问题。单源最短路径问题是指从一个出发顶点到所有可达顶点的最短路径问题。Dijkstra算法的原理是通过将图中的每个...

    单源最短路径实验报告

    【部分内容】中具体介绍了Dijkstra算法,这是解决单源最短路径问题的经典算法。Dijkstra算法的核心思想是维护一个集合S,集合S中的顶点代表已经找到从源节点到这些顶点最短路径的节点。算法初始时,S仅包含源节点,...

    贪心算法 Dijkstra 单源最短路径

    用C++实现的贪心算法 Dijkstra 单源最短路径,并包含大量的注释,对理解程序很有帮助

    单源最短路径dijkstra模板

    单源最短路径Dijkstra模板 Dijkstra算法是一种常用的图算法,用于解决单源最短路径问题。该算法的基本思想是,通过维护一个距离数组,记录从源节点到其他所有节点的最短距离,并不断更新这些距离,使得它们变得...

    基于贪心法求解单源最短路径问题.docx

    实验目的:理解贪心法的核心思想、贪心法的求解过程,并从算法分析与设计的角度,对单源最短路径问题的 Dijkstra 算法求解有进一步理解。 实验内容: 1. 问题描述:给定一个有向带权图 G=(V,E),其中每条边的权是...

    单源最短路径 直接copy 运行即可,里面有测试结果

    本篇文章将深入探讨单源最短路径的概念、Dijkstra算法的原理,并通过一个具体的Java实现案例来理解其实际应用。 #### 单源最短路径概念 单源最短路径问题旨在找到一个加权图中从给定源节点到其余所有节点的最短...

    Dijkstra求单源最短路径

    Dijstra算法用于求解单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。

    用Dijkstra算法实现单源最短路径问题

    ### Dijkstra算法实现单源最短路径问题 #### 算法原理 Dijkstra算法是一种用于寻找图中两点之间的最短路径的经典算法。它适用于所有边权重非负的情况,并且可以高效地解决单源最短路径问题。在该问题中,我们需要...

    Dijkstra单源最短路径代码 C/C++实现

    DIJKSTRA单源最短路径算法C/C++实现,内有注释,输入邻接矩阵,输入源点到终点最短路径长度。

    单源最短路径vc源码(贪心算法)

    Dijkstra算法是最常用的求解单源最短路径的贪心算法之一,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出。这个算法适用于加权有向图或无向图,其基本思想是每次扩展最短路径树,将当前未访问且与已访问节点距离...

    python实现有向图单源最短路径迪杰斯特拉 算法

    迪杰斯特拉(Dijkstra)算法是一种用于寻找有向图中单源最短路径的经典算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。在这个算法中,我们从一个源节点开始,逐步扩展最短路径到其他节点,直到到达所有...

    图的最短路径-dijkstra算法.ppt

    Dijkstra算法是一种常用的单源最短路径算法,用于解决带权有向图中的最短路径问题。 单源最短路径问题 单源最短路径问题是指从给定的源顶点s到其它顶点v的权最小路径。该问题可以形式化地描述为:给定一个带权有向...

    单源最短路径(算法 代码)

    单源最短路径问题在计算机科学中是一个经典且重要的图论问题,主要目的是找到图中一个指定源节点到其他所有节点的最短路径。这个问题在路由、网络优化、任务调度等多个领域都有广泛应用。本篇文章将深入探讨单源最短...

    单源最短路径( Dijkstra算法)JAVA实现

    总的来说,Dijkstra算法是解决单源最短路径问题的基石,Java实现使其能够方便地应用于各种实际场景。通过对`Dijkstra.java`文件的理解和学习,你可以深入掌握这一重要算法,并将其运用到自己的项目中。

    单源最短路径问题的Dijkstra算法

    ### 单源最短路径问题的Dijkstra算法详解 #### 一、算法背景与应用场景 在图论中,单源最短路径问题是指在一个带有非负权重边的有向图或无向图中找到从一个指定顶点(称为源点)到其他所有顶点的最短路径的问题。...

    最短路课件 求单源最短路径

    Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出的,主要用于寻找带非负权重的图中单源最短路径。该算法基于贪心策略,每次选取当前未标记且距离源点最近的顶点,并更新与其相邻顶点的距离。它使用...

    单源最短路径

    2. **掌握并实现迪杰斯特拉(Dijkstra)算法,用于解决单源最短路径问题**。 3. **能够熟练使用C++编程语言进行算法的实现,并调试程序**。 4. **学会如何利用数据结构优化算法性能**。 #### 三、实验要求 1. **熟悉...

    贪心算法之应用-单源最短路径-Dijkstra算法学习

    贪心算法之应用-单源最短路径-Dijkstra算法学习

Global site tag (gtag.js) - Google Analytics