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

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

#include "stdafx.h"
#include 

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]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

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

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

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

dijkstra由于是贪心的,每次都找一个距源点最近的点(dmin),然后将该距离定为这个点到源点的最短路径(d[i]<--dmin);但如果存在负权边,那就有可能先通过并不是距源点最近的一个次优点(dmin'),再通过这个负权边L(L<0),使得路径之和更小(dmin'+L 
  
 
  
弗洛伊德算法点与点的距离放在一个二维矩阵内,
// myfloyd.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 

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


你可能感兴趣的:(随笔)