迪杰斯特拉算法 源程序
来源:互联网 发布:免费的代理软件 编辑:程序博客网 时间:2024/05/22 14:08
/**********************迪杰斯特拉算法*********************************************/
#include <stdio.h>
#define INFINITY 10000
#define TRUE 1
#define FALSE 0
#define VERTEX_NUM 6
typedef struct Graph
{
char vexs[VERTEX_NUM]; /*顶点*/
int arcs[VERTEX_NUM][VERTEX_NUM]; /*邻接矩阵*/
int vexnum; /*顶点数*/
int arcnum; /*弧数*/
}Graph;
void ShortestPath(Graph g,int v0,int p[][VERTEX_NUM],int d[])
{
/*迪杰斯特拉算法求最短路径,g为图的邻接矩阵,v0为起始顶点,
p[v][w]储存v0到v路径上w的后继顶点(无后继置-1),d[v]为路径v0到v的带权长度*/
int v;
int w;
int min;
int i,j;
int final[VERTEX_NUM]; /*final[v]=TRUE当且仅当v属于S*/
/*初始化数组*/
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] = -1;
}
if (d[v] < INFINITY)
{
p[v][0] = v0;
p[v][1] = v;
}
}
/*初始化,顶点v0属于S集合*/
d[v0] = 0;
final[v0] = TRUE;
/*循环n-1次求最短路径*/
for (i = 1; i < g.vexnum; i++)
{
min=INFINITY;
for (w = 0; w<g.vexnum; w++)
{
if (!final[w]) /* w属于V-S */
{
if (d[w] < min)
{
/* w顶点离v0更近 */
v=w;
min=d[w];
}
}
}
final[v] = TRUE; /*离v0顶点最近的v加入S集*/
for (w = 0; w<g.vexnum; w++) /*更新当前最短路径及距离*/
{
if (!final[w] && (min+g.arcs[v][w] < d[w]) )
{
/*修改d[w]和p[w] (w属于V-S) */
d[w] = min + g.arcs[v][w];
for (j = 0; p[v][j]> -1 && j < VERTEX_NUM; j++)
{
p[w][j] = p[v][j]; /* p[w]=p[v] */
}
p[w][j] = w; /* p[w]=p[v]+w */
}
}
}
}
void main()
{
int i,
j;
Graph g;
int p[VERTEX_NUM][VERTEX_NUM];
int d[VERTEX_NUM];
int v0;
/*初始化图g*/
g.vexs[0]='A',g.vexs[1]='B',g.vexs[2]='C',g.vexs[3]='D',g.vexs[4]='E',g.vexs[5]='F';
for(i=0;i<VERTEX_NUM;i++)
for(j=0;j<VERTEX_NUM;j++)
g.arcs[i][j]=INFINITY;
g.arcs[0][2]=10,g.arcs[0][4]=30,g.arcs[0][5]=100,g.arcs[1][2]=5,
g.arcs[2][3]=50,g.arcs[3][5]=10,g.arcs[4][3]=20,g.arcs[4][5]=60;
g.vexnum=g.arcnum=VERTEX_NUM;
/*输出图的有关信息*/
for(i=0;i<VERTEX_NUM;i++)
{
printf("%c/t",g.vexs[i]);
for(j=0;j<VERTEX_NUM;j++)
{
printf("%5d ",g.arcs[i][j]);
}
printf("/n");
}
printf("/n");
/*求最短路径*/
v0 = 0;
ShortestPath(g,v0,p,d);
/*输出最短路径*/
for (i = 0; i < g.vexnum; i++)
{
printf("Path %c to %c:/n",g.vexs[v0],g.vexs[i]);
if ( p[i][v0] != -1 ) /*存在路径则输出*/
{
for (j = 0; p[i][j]!=-1; j++)
{
if (j != 0)
printf("→");
printf(" %c",g.vexs[p[i][j]]);
}
printf("/n");
}
printf("Length:%d/n",d[i]);
printf("/n");
}
}
/**********************迪杰斯特拉算法*********************************************/
- 迪杰斯特拉算法 源程序
- C++遗传算法源程序
- 神经网络BP算法 源程序
- 遗传算法的C源程序
- 【分享】基本遗传算法源程序
- 图像边缘检测算法源程序
- niblack 二值化算法源程序 matlab
- 一个matlab遗传算法源程序
- java中MD5算法源程序
- fftw和kiss_fft算法源程序
- 一个matlab遗传算法源程序
- 基于遗传算法优化神经网络结构源程序
- 高效的图像抖动算法源程序
- 常用排序算法总结及C源程序
- MyEclipse6.0序列号算法源程序 调试通过
- ACM_算法竞赛入门_源程序
- PMVS算法源程序 VS2008下实现
- Apriori算法介绍--附java源程序
- 加滚动条的可排序表格
- 写Bootloader,Kernel,Rootfs到SD卡步骤
- 二进制文件的读写
- 如何提高Linux系统安全性
- Java 理论与实践: 并发集合类
- 迪杰斯特拉算法 源程序
- 文本文件的读写
- C#中Split分隔字符串的应用(C#、split、分隔、字符串)
- 教你用笔记本破解无线路由器密码
- [ASP中使用三层架构] 1.前言
- SWT/JFace 中常用的事件
- ubuntu下架设svn服务器及在windows建立svn+ssh客户端
- 关于Java中的Cookie
- 谈谈Enterprise search 中的 custom relevancy