文章目录

一、路径的概念

二、Dijkstra算法解决单源

三、Floyd算法解决多源

一、路径的概念:

考虑带权有向图,把一条路径(仅仅考虑简单路径)上所经边的权值之和定义为该路径的路径长度或称带权路径长度


二、迪克斯特拉(Dijkstra)算法解决单源:

需要解决的带权有向图的最短路径问题:

不适合负权值:














Dijkstra算法代码实现:

#include<stdio.h>

#define maxn 2510
#define INF 999999 //无穷大 

int n,m,s,t;//n表示顶点个数,m表示边数,s表示起点,t表示终点 
int map[maxn][maxn];//用矩阵来存储图 
int visited[maxn];//记录,标记 
int dist[maxn];//最短路径 

void Dijkstra(){
   
	//初始化最短路径数组 
	for(int i=0;i<n;i++)
	dist[i]=INF;
	//起点为值0 
	dist[s]=0;
	//进行n次循环 
	for(int i=0;i<n;i++){
   
		int u=-1;int MIN=INF;
		//找出对应最短边 
		for(int j=0;j<n;j++){
   
			if(!visited[j]&&dist[j]<MIN)
			{
   
				MIN=dist[j];
				u=j;
			}
		}
		if(u==-1) break;
		visited[u]=1;
		//看第三条边是否能使路径变短,若能就换 
		for(int v=0;v<n;v++)
		{
   
			if(!visited[v]&&map[u][v]!=INF&&dist[u]+map[u][v]<dist[v])
			dist[v]=dist[u]+map[u][v];
		}
	}
}
int main()
{
   
	//输入顶点,边,起点,终点 
	scanf("%d %d %d %d",&n,&m,&s,&t);
	//初始化,
	for(int i=0;i<n;i++)
	for(int j=0;j<n;j++)
	{
   
		if(i!=j)
		map[i][j]=INF;	
	}
	//输入每条边对应的路径长度 
	for(int i=0;i<m;i++)
	{
   
		int t1,t2,t3;
		scanf("%d %d %d",&t1,&t2,&t3);
		map[t1][t2]=map[t2][t1]=t3;
	}
	Dijkstra();
	printf("%d",dist[t]);
}

三、弗洛伊德(Floyd)算法: