Dijkstra
作者:刘伟
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#define MAX 100
#define INF 100000
using namespace std;
struct Graph
{
int edges[MAX][MAX]; //邻接矩阵
int n; //顶点数
int e; //边数
};
bool visited[MAX]; //标记顶点是否被访问过
int dis[MAX]; //dis[i]存储结点0到i的最短距离
Graph G;
void creatGraph() //用引用作参数
{
int i,j;
int s,t; //存储顶点编号
int v; //存储边的权值
for(i=0;i<G.n;i++) //初始化
{
for(j=0;j<G.n;j++)
{
G.edges[i][j]=INF; //注意:初始值为无穷大 !!!
}
visited[i]=false;
}
for(i=0;i<G.e;i++) //对矩阵相邻的边赋权值
{
scanf("%d %d %d",&s,&t,&v); //输入边的顶点编号以及权值
G.edges[s-1][t-1] = v;
}
}
void Dijkstra() //求最短路径
{
for (int i = 0; i < G.n; i++)
{
dis[i] = INF;
}
dis[0] = 0;
for (int i = 0; i < G.n; i++)
{
//每次在还未确定最短路的点中,取一个当前已得到的所有可能的路径长度中最短的那个点,设此点为mark,然后对所有与mark相连的点进行松弛操作
int mark = -1, mindis = INF;
for (int j = 0; j < G.n; j++)
{
if (!visited[j] && dis[j] < mindis)
{
mindis = dis[j];
mark = j;
}
}
visited[mark] = true;
for (int k = 0; k < G.n; k++)
{
dis[k] = min(dis[k], dis[mark] + G.edges[mark][k]);
}
}
}
int main(void)
{
int n,e; //建立的图的顶点数和边数
while(scanf("%d %d",&n,&e)==2&&n>0)
{
G.n=n;
G.e=e;
creatGraph();
Dijkstra();
for(int k = 0; k < G.n; k++)
{
printf("%d ", dis[k]);
}
}
system("pause");
return 0;
}