#include <cstdio> #include <cstdlib> //using namespace std; #define SIZE 6 #define INFINITY 0X7FFFFFFF int arcs[SIZE][SIZE]={0,INFINITY,10,INFINITY,30,100,\ INFINITY,0,5,INFINITY,INFINITY,INFINITY,\ INFINITY,INFINITY,0,50,INFINITY,INFINITY,\ INFINITY,INFINITY,INFINITY,0,60,10,\ INFINITY,INFINITY,INFINITY,20,0,60,\ INFINITY,INFINITY,INFINITY,INFINITY,INFINITY,0}; bool flag[SIZE]={false,false,false,false,false,false}; int Dis[SIZE]={0,0,0,0,0,0};//保存v0到其他各点的距离 bool ArcTop[SIZE][SIZE]; void Init() {//初始化矩阵 for(int i=0;i<SIZE;i++) { Dis[i]=arcs[0][i]; for(int j=0;j<SIZE;j++) { ArcTop[i][j]=false; } if(Dis[i]<INFINITY) { ArcTop[i][0]=true; ArcTop[i][i]=true; } } }
void ShortestPath_DIJ() { //第一个节点 Dis[0]=0; flag[0]=true; for(int i=1;i<SIZE;i++) { int min=INFINITY; int temp;// //下面这个for循环查找Dis[]不断更新min的值 for(int j=0;j<SIZE;j++) { if(!flag[j]) { if(Dis[j]<min) { temp=j; min=Dis[j]; } } } flag[temp]=true;// for(int kk=0;kk<SIZE;kk++) { if(!flag[kk]&&arcs[temp][kk]!=INFINITY&&min+arcs[temp][kk]<Dis[kk]) {//只要temp结点为源,如果能更新,都更新。 Dis[kk]=min+arcs[temp][kk]; for(int k=0;k<SIZE;k++) { ArcTop[kk][k]=ArcTop[temp][k];//所经过的结点保存起来,经过一次,把结点保存一次 } ArcTop[kk][kk]=true; } } } } void Output() { for(int i=0;i<SIZE;i++) { for(int j=0;j<SIZE;j++) { if(ArcTop[i][j]) printf("%d",j); } printf("\n"); } } int main() { Init(); ShortestPath_DIJ(); Output(); system("PAUSE"); return 0; }
|
评论
发表评论