最短路径--贪心算法

一、问题分析

     (1)带权图(2)给定一个顶点(3) 计算该顶点到各个顶点的最短路径长度:注意这句话。

二、算法设计

(1)假定原点 u ;(2)对顶点划分,分为两个集合:集合S(存放已经确定最短路径的顶点)和集合V--S(存放还未确定最短路径的长度);(3)dist[ ]:记录当前每个顶点所对应的最短特殊路径长度;(4)带权临阶矩阵map[ ][ ], 先把这个数组的值全部赋值为无穷大,然后接收值,如果有边就赋值为改边的值;(5)p[i]:来记录最短路径上i顶点的前驱

三、算法步骤

四、图解

五、代码



 
 
写了代码注释很长时间,一不小心删了。。。我想死
#include<cstdio>
#include<iostream>
#include<cstring>
#include<windows.h>
#include<stack>
using namespace std;
const int N=100;
const int INF=1e7;
int map[N][N];
int dist[N],p[N],n,m;
bool flag[N];
void Dijkstra(int u){
	for(int i=1;i<=n;i++){
		dist[i]= map[u][i];
		flag[i]=false;
		if(dist[i]==INF)
			p[i]=-1;
		else
			p[i]=u;
	}
	dist[u]=0;
	flag[u]=true;
	for(int i=1;i<=n;i++){
		int temp=INF,t=u;
		for(int j=1;j<=n;j++){
			if(!flag[j]&&dist[j]<temp){
				t=j;
				temp=dist[j];
			}
			if(t==u) return;
			flag[t]=true;
			for(int j=1;j<=n;j++){
				if(!flag[j]&&map[t][j]<INF){
					if(dist[j]>(dist[t]+map[t][j])){
						dist[j]=dist[t]+map[t][j];
						p[j]=t;
					}
				}
			}
		}
	}
}

int main(){
	int u,v,w,st;
	system("color 4A");
	cout<<"请输入城市的个数:";
	cin>>n;
	cout<<"请输入城市之间线路的个数:";
	cin>>m;
	cout<<"请输入城市之间的路线以及距离:"<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			map[i][j]=INF;
		}
	}
	while(m--){
		cin>>u>>v>>w;
		map[u][v]=min(map[u][v],w);
	}
	cout<<"请输入dgs所在的位置:";
	cin>>st;
	Dijkstra(st);
	cout<<"dgs所在的位置:"<<st<<endl;
	for(int i=1;i<=n;i++){
		cout<<"dgs:"<<st<<"--"<<"想去的位置:"<<i;
		if(dist[i]==INF)
			cout<<"dgs,这里没路,快滚"<<endl;
		else
			cout<<"最短距离:"<<dist[i]<<endl;
	}
	return 0;
}


                              

猜你喜欢

转载自blog.csdn.net/qq_40728285/article/details/79886086