迪杰斯特拉算法:
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。
它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
基本思想
通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。
它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。
此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是"起点s到该顶点的路径"。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 … 重复该操作,直到遍历完所有顶点。
http://www.cnblogs.com/skywang12345/p/3711512.html#anchor2
#include <stdio.h>
#include <stdlib.h>
#define max 20
//邻接表
typedef struct List
{
int strat;
int end;
int length;
}List;
//图
typedef struct Graph
{
int vertex[max];//节点
int weight[max][max];//权重
int num;//个数
}Graph;
//找到最短结点
int FindMin(int *dist,int *S,Graph G)
{
int min=100000;
int temp=-1;
for(int i=1;i<=G.num;i++)
{
if(S[i]==0)//未被存放
{
if(dist[i]<min)
{
min=dist[i];
temp=i;
}
}
}
return temp;
}
//迪杰斯特拉算法
void Dijkstra(Graph G,int start,int *dist,int *S,int *path)
{
for(int i=1;i<=G.num;i++)//初始化dist数组
{
dist[i]=G.weight[start][i];
if(dist[i]<=10000)//有路
{
path[i]=start;
}
else//没有路径
{
path[i]=-1;
}
}
S[start]=1;
int num=1;//计数,已经完成的点
while(num < G.num)
{
int min=FindMin(dist,S,G);
S[min]=1;//已完成
for(int i=1;i<=G.num;i++)
{
if(S[i]==0 && (dist[i]>dist[min]+G.weight[min][i]))//判断
{
dist[i]=dist[min]+G.weight[min][i];
path[i]=min;
if(dist[i]>10000) path[i]=-1;//注意没有路径
}
}
num++;
}
}
int FindMinNew(int *dist,int *S,Graph G,int *path)
{
int min=100000;
int temp=-1;
for(int i=2;i<=G.num;i++)
{
if(S[i]==1 && path[i]!=-1)//未被输出
{
if(dist[i]<min)
{
min=dist[i];
temp=i;
}
}
else if(path[i]==-1)//无法到达
{
S[i]=0;
return i;
}
}
S[temp]=0;//输出
return temp;
}
void Dispaly(Graph G,int *dist,int *S,int *path)
{
int order;
for(int i=1;i<G.num;i++)
{
order = FindMinNew(dist,S,G,path);
if(dist[order]>=1000)
printf("%d %d %d\n",1,order,-1);
else
printf("%d %d %d\n",1,order,dist[order]);
}
}
int main()
{
int n,m;
int dist[max]={0};
int path[max]={0};
int S[max]={0};//存放已完成结点
scanf("%d %d",&n,&m);
List temp[m+1];
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&temp[i].strat,&temp[i].end,&temp[i].length);
}
Graph G;
G.num=n;
int k=1;
//转换为邻接矩阵
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==temp[k].strat && j==temp[k].end)//邻接表
{
G.weight[i][j]=temp[k].length;
k++;
}
else//其余的赋值10000
{
G.weight[i][j]=10000;
}
}
}
Dijkstra(G,1,dist,S,path);
Dispaly(G,dist,S,path);
return 0;
}