c语言实现求最短路径(迪杰斯特拉算法,《数据结构》算法7.15)
2016-03-03 21:13
701 查看
迪杰斯特拉算法从小到大的求出了从源点到其余各个点的最短路径,用到了邻接矩阵的储存结构。
代码如下:#include<stdio.h>
#define MAX_VERTEX_NUM 100
#define INFINITY 2000000000
typedef struct {
int vexs[MAX_VERTEX_NUM];
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum,arcnum;
}MGraph;
int LocateVex(MGraph G,int v){
for(int i=0;i<G.vexnum;i++){
if(G.vexs[i]==v)return i;
}
}
void CreateUDN(MGraph &G){
int i,j,k;
printf("输入顶点个数和弧的个数:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);//输入顶点个数,弧额条数,以及是否有关于弧的相关信息
printf("输入各个顶点的名称(数字):\n");
for(i=0;i<G.vexnum;i++)
scanf("%d",&G.vexs[i]);//输入各个顶点,这里顶点的数据类型默认为int类型
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
if(i==j)G.arcs[i][j]=0;//顶点自身到自身的权值为0
else G.arcs[i][j]=INFINITY;//初始化图
printf("输入各条弧的两个顶点和权值:\n");
for(k=0;k<G.arcnum;k++){
int v1,v2,weight;
scanf("%d %d %d",&v1,&v2,&weight);//输入弧的两个顶点
i=LocateVex(G,v1);j=LocateVex(G,v2);//寻找两个顶点在矩阵中的位置
G.arcs[i][j]=weight;
G.arcs[j][i]=G.arcs[i][j];//置<v1,v2>的对称弧<v2,v1>
}
}
bool P[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//p[v][w]==ture代表w是从v0到v的最短路径中的顶点
bool final[MAX_VERTEX_NUM];//final[v]代表已经找到v0到v的最短路径
int D[MAX_VERTEX_NUM];//最短路径的带权长度
void ShortestPath_DLJ(MGraph G,int v0){
int v,w,i,j;
for(v=0;v<G.vexnum;v++){
final[v]=false; //初始化
D[v]=G.arcs[v0][v];
for(w=0;w<G.vexnum;w++) P[v][w]=false;//每条路径都先设为空
if(D[v]<INFINITY){P[v][v0]=true; P[v][v]=true;}//如果v与v0直接连接,则添加路径
}
D[v0]=0; final[v0]=true; //初始化,v0顶点属于S集合,即找到最短路径的集合
for(i = 1;i<G.vexnum;i++){//每次循环求得一个v0到某个v顶点的最短路径,并将v加到S集合
int minn=INFINITY;
for(w = 0;w<G.vexnum;w++)
if(!final[w])
if(D[w]<minn){v = w;minn = D[w];}//找到距离v0最近的点
final[v]=true;
for(w = 0;w<G.vexnum;w++)//更新当前最短路径及距离
if(!final[w]&&(minn+G.arcs[v][w])<D[w]){//修改D[w]和P[w],w属于V-S
D[w] = minn+G.arcs[v][w];
for(j=0;j<G.vexnum;j++){//将v的路径赋值给P[w]
if(P[v][j]=true)P[w][j]=true;
}
P[w][w]=true;//添加路径的最后一个点w
}
}
}
void Print_ShortestPath(MGraph G,int v0){
int i,j;
for(i=0;i<G.vexnum;i++){
printf("%d->%d:",v0,i);
printf("%d\n",D[i]);
}
}
int main(){
MGraph G;
CreateUDN(G);
int v0;
printf("输入起始顶点:\n");
scanf("%d",&v0);//最短路径的起始点v0
ShortestPath_DLJ(G,v0);//求出从v0出发至各个点的最短路径
Print_ShortestPath(G,v0); //输出从v0出发至各个点的最短路径权值合
return 0;
}
代码如下:#include<stdio.h>
#define MAX_VERTEX_NUM 100
#define INFINITY 2000000000
typedef struct {
int vexs[MAX_VERTEX_NUM];
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum,arcnum;
}MGraph;
int LocateVex(MGraph G,int v){
for(int i=0;i<G.vexnum;i++){
if(G.vexs[i]==v)return i;
}
}
void CreateUDN(MGraph &G){
int i,j,k;
printf("输入顶点个数和弧的个数:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);//输入顶点个数,弧额条数,以及是否有关于弧的相关信息
printf("输入各个顶点的名称(数字):\n");
for(i=0;i<G.vexnum;i++)
scanf("%d",&G.vexs[i]);//输入各个顶点,这里顶点的数据类型默认为int类型
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
if(i==j)G.arcs[i][j]=0;//顶点自身到自身的权值为0
else G.arcs[i][j]=INFINITY;//初始化图
printf("输入各条弧的两个顶点和权值:\n");
for(k=0;k<G.arcnum;k++){
int v1,v2,weight;
scanf("%d %d %d",&v1,&v2,&weight);//输入弧的两个顶点
i=LocateVex(G,v1);j=LocateVex(G,v2);//寻找两个顶点在矩阵中的位置
G.arcs[i][j]=weight;
G.arcs[j][i]=G.arcs[i][j];//置<v1,v2>的对称弧<v2,v1>
}
}
bool P[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//p[v][w]==ture代表w是从v0到v的最短路径中的顶点
bool final[MAX_VERTEX_NUM];//final[v]代表已经找到v0到v的最短路径
int D[MAX_VERTEX_NUM];//最短路径的带权长度
void ShortestPath_DLJ(MGraph G,int v0){
int v,w,i,j;
for(v=0;v<G.vexnum;v++){
final[v]=false; //初始化
D[v]=G.arcs[v0][v];
for(w=0;w<G.vexnum;w++) P[v][w]=false;//每条路径都先设为空
if(D[v]<INFINITY){P[v][v0]=true; P[v][v]=true;}//如果v与v0直接连接,则添加路径
}
D[v0]=0; final[v0]=true; //初始化,v0顶点属于S集合,即找到最短路径的集合
for(i = 1;i<G.vexnum;i++){//每次循环求得一个v0到某个v顶点的最短路径,并将v加到S集合
int minn=INFINITY;
for(w = 0;w<G.vexnum;w++)
if(!final[w])
if(D[w]<minn){v = w;minn = D[w];}//找到距离v0最近的点
final[v]=true;
for(w = 0;w<G.vexnum;w++)//更新当前最短路径及距离
if(!final[w]&&(minn+G.arcs[v][w])<D[w]){//修改D[w]和P[w],w属于V-S
D[w] = minn+G.arcs[v][w];
for(j=0;j<G.vexnum;j++){//将v的路径赋值给P[w]
if(P[v][j]=true)P[w][j]=true;
}
P[w][w]=true;//添加路径的最后一个点w
}
}
}
void Print_ShortestPath(MGraph G,int v0){
int i,j;
for(i=0;i<G.vexnum;i++){
printf("%d->%d:",v0,i);
printf("%d\n",D[i]);
}
}
int main(){
MGraph G;
CreateUDN(G);
int v0;
printf("输入起始顶点:\n");
scanf("%d",&v0);//最短路径的起始点v0
ShortestPath_DLJ(G,v0);//求出从v0出发至各个点的最短路径
Print_ShortestPath(G,v0); //输出从v0出发至各个点的最短路径权值合
return 0;
}
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)