dijkstra算法写起来很容易,但是理解,证明它的正确性却不容易。
#include"Graph.h"
#include<assert.h>
#include<iostream>
#include<fstream>
#include<limits>
using namespace std;
const int MAX=std::numeric_limits<int>:: max();
int main()
{
ifstream cin("input.txt");
int vertex_num=5;
Graph<char,int> myGraph(vertex_num);
myGraph.Init(cin);
//myGraph.RandInit();
int *visited=new int[vertex_num];
int *dis=new int[vertex_num];
int *output=new int[vertex_num];
visited[0]=1;
output[0]=0;
for(int i=1;i<vertex_num;i++)
{
dis[i]=myGraph.getWeight(0,i);
visited[i]=0;
output[i]=0;
}
for(int i=1;i<vertex_num;i++)
{
int min=MAX;
int min_index=-1;
for(int j=0;j<vertex_num;j++)
{
if(visited[j]==0&&dis[j]<min)
{
min=dis[j];
min_index=j;
}
}
visited[min_index]=1;
for(int j=0;j<vertex_num;j++)
{
int temp_weight;
if(visited[j]==0&&(temp_weight=myGraph.getWeight(min_index,j))<MAX&&dis[j]>dis[min_index]+temp_weight)
{
dis[j]=dis[min_index]+temp_weight;
output[j]=min_index;
}
}
}
for(int i=1;i<vertex_num;i++)
{
int j=i;
cout<<j<<"到0的路径是长度:"<<dis[j]<<"路径是:";
while(j!=0)
{
cout<<j<<" ";
j=output[j];
}
cout<<0<<endl;
}
return 0;
}