关闭

迪杰斯特拉算法与弗洛伊德算法

标签: 算法 迪杰斯特拉
790人阅读 评论(0) 收藏 举报
分类:

// mydjstl.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

#pragma comment(linker, "/STACK:10000000 ")//扩大栈的大小,默认栈的大小为1M,这时maxnum=1000的话会超过栈的承受能力,因此设置栈大小为10M后面的10000000表示10Mb

#define maxnum 1000
#define maxint 99999

int mydjstl(int s,int e,int num,int *dist,int c[maxnum][maxnum])
{
	int res=0;
	int sa[maxnum]={0};//查看节点i是否在已遍历节点集合中
	for(int i=1;i<=num;i++)//初始化dist数组距离
	{
		dist[i]=c[s][i];
	}
	sa[s]=1;//首节点设置为已遍历集合中
	
	for(int i=2;i<=num;i++)//进行n-1次循环
	{
		int u=s;
		int tmp=maxint;
		for(int i=1;i<=num;i++)
		{
			if(!sa[i] && dist[i]<tmp)//对每一个未遍历的节点进行遍历,找到所有未遍历结点中距离首节点中最小的节点,然后将该节点加入到已遍历集合中
			{
				tmp=dist[i];
				u=i;
			}
		}
		sa[u]=1;
		for(int i=1;i<=num;i++)//更新dist数组
		{
			if(!sa[i] && c[i][u]<maxint)
			{
				int newdist = dist[u]+c[i][u];
				if(dist[i]>newdist)
				{
					dist[i]=newdist;
				}
			}
		}
	}
	res=dist[e];


	return res;
}

int _tmain(int argc, _TCHAR* argv[])
{
	freopen("input.txt","r",stdin);
	int dist[maxnum];
	int c[maxnum][maxnum];
	int n,line;

	cin>>n;
	cin >>line;
	int p,q,len;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			c[i][j]=maxint;
		}
	}
	for(int i=1;i<=line;++i)
	{
		cin>>p>>q>>len;
		if(len<c[p][q])
		{
			c[p][q]=len;
			c[q][p]=len;
		}
	}
	for(int i=1;i<=n;i++)
		dist[i]=maxint;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			printf("%8d",c[i][j]);
		}
		cout<<endl;
	}

	int res=mydjstl(4,3,n,dist,c);//输出节点4到节点3的路径
	cout<<res<<endl;


	return 0;
}

迪杰斯特拉老爷子的算法在在网络中被大量使用,说明一下;

迪杰斯特拉算法就是从首节点出发进行遍历,找到距离最小的下一节点,加入已经遍历的集合当中,代码说明一切:

注意迪杰斯特拉算法不能存在负权值边,因为

dijkstra由于是贪心的,每次都找一个距源点最近的点(dmin),然后将该距离定为这个点到源点的最短路径(d[i]<--dmin);但如果存在负权边,那就有可能先通过并不是距源点最近的一个次优点(dmin'),再通过这个负权边L(L<0),使得路径之和更小(dmin'+L<dmin),则dmin'+L成为最短路径,并不是dmin,这样dijkstra就被囧掉了。

弗洛伊德算法点与点的距离放在一个二维矩阵内,
// myfloyd.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

#define maxint 9999
#define maxnum 1000

int c[maxnum][maxnum];

void floyd(int num)
{
	int i=0,j=0,k=0;
	for(k=1;k<=num;k++)
	{
		for(i=1;i<=num;i++)
		{
			for(j=1;j<=num;j++)
			{
				if(c[i][j]>c[i][k]+c[k][j])
				{
					c[i][j]=c[i][k]+c[k][j];//结果就在矩阵中,如果i->k->j的距离小于i->j,那么将k加入到i与j之间
				}
			}
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	freopen("input.txt","r",stdin);
	int dist[maxnum];
	
	int n,line;

	cin>>n;
	cin >>line;
	int p,q,len;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i==j)
				c[i][j]=0;
			else
				c[i][j]=maxint;
		}
	}
	for(int i=1;i<=line;++i)
	{
		cin>>p>>q>>len;
		if(len<c[p][q])
		{
			c[p][q]=len;
			//c[q][p]=len;
		}
	}
	for(int i=1;i<=n;i++)
		dist[i]=maxint;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			printf("%8d",c[i][j]);
		}
		cout<<endl;
	}
	floyd(n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			printf("%8d",c[i][j]);
		}
		cout<<endl;
	}


	return 0;
}


0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7012次
    • 积分:226
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论