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

来源:互联网 发布:sql更改语句 编辑:程序博客网 时间:2024/05/22 15:59

// 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 99999int 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 1000int 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;elsec[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
原创粉丝点击