#include <stdio.h> #include <string.h> #include <iostream.h> #define MaxVertex 250 #define INIT 999999 void Dijkstra(int Graph[][MaxVertex],int NunOfVertex,int OriginalPoint,int PrePoint[],int dist[]) { int i,j; int min,locate; bool visited[MaxVertex];//标记结点是否已经加入到路径图中 memset(visited,0,sizeof(visited)); /************************************************************************/ /* 把OriginalPoint(源点)到其他顶点的权值放入dist数组中 */ /************************************************************************/ for (i=1;i<=NunOfVertex;i++) { dist[i]=Graph[OriginalPoint][i]; if(dist[i]!=INIT) PrePoint[i] = OriginalPoint; else PrePoint[i] = 0; } dist[OriginalPoint] = 0; visited[OriginalPoint] = 1; for (j=1;j<=NunOfVertex;j++) { min = INIT; /************************************************************************/ /* 寻找当前未被访问结点中权值最小的点,准备加入路径图中 */ /************************************************************************/ for (i=1;i<=NunOfVertex;i++) { if (!visited[i]&&dist[i]<min) { min = dist[i]; locate = i; } } visited[locate] = true; for (i=1;i<=NunOfVertex;i++) { if (!visited[i]) { if (dist[i]>dist[locate]+Graph[locate][i]) { dist[i] = Graph[locate][i]+dist[locate];//更新源点到i点的权值 PrePoint[i] = locate; } } } } } int main() { int Graph[MaxVertex][MaxVertex]; int i,j; int begin,end;//边起点,边终点 int NumOfVertex,NumOfArc,weight;//顶点数,边数,权值 int dist[MaxVertex];//源点到其他点的权值 int PrePoint[MaxVertex];//当前结点的前驱点 freopen("e://1.txt","r",stdin); scanf("%d%d",&NumOfVertex,&NumOfArc); for (i=0;i<=NumOfVertex;i++) { for (j=0;j<=NumOfVertex;j++) { if(i == j) Graph[i][j] = 0; else Graph[i][j] = INIT; } } for (j=0;j<NumOfArc;j++) { scanf("%d%d%d",&begin,&end,&weight); Graph[begin][end] = weight; Graph[end][begin] = weight; } Dijkstra(Graph,NumOfVertex,1,PrePoint,dist); return 0; }