正权最短路径——Dijkstra

来源:互联网 发布:dot tk注册域名 编辑:程序博客网 时间:2024/05/08 02:17

图算法里面的基础算法,没什么好说的~

代码:

#include<iostream>#include<fstream>#include<cstring>using namespace std;#define max 1000int graph[100][100];int visited[100];int dist[100];int path[100];int num;void fway(int n){path[n]=-1;dist[n]=0;visited[n]=1;int nown=n;for(int i=0;i<num-1;i++){for(int j=0;j<num;j++){if(visited[j]!=1&&(dist[nown]+graph[nown][j])<dist[j]){dist[j]=dist[nown]+graph[nown][j];path[j]=nown;}}int mindist=max;for(int j=0;j<num;j++){if(visited[j]!=1&&mindist>dist[j]){mindist=dist[j];nown=j;}}visited[nown]=1;}}int main(){ifstream in;in.open("graph.txt",ios::in);in>>num;for(int i=0;i<num;i++){for(int j=0;j<num;j++){in>>graph[i][j];}}memset(path,-1,sizeof(path));memset(visited,0,sizeof(visited));for(int i=0;i<num;i++)dist[i]=max;fway(0);for(int i=0;i<num;i++)cout<<path[i]<<"\t";cout<<endl;for(int i=0;i<num;i++)cout<<dist[i]<<"\t";cout<<endl;return 0;}


这个写的时候还算比较顺利,唯一出现的问题就是memset函数没有用好,开始的时候给dist数组赋初值的售后也用了它,结果错的大发了...然后百度的memset的用法,原来它的填充是以字节为单位,一般用于对字符型变量的初值进行赋值,而我开始的时候填充的是max值,所以错了。(稍后粘一个memset用法的文章,作为参考)


这个我就测了两组数据,如果有哪位朋友发现了错误或者不妥的地方,欢迎批评指正。

原创粉丝点击