Dijkstra算法
2016-07-11 12:44
183 查看
《数据结构与算法分析——C语言描述》 第九章
struct TableEntry {
int known;
double dist;
Vertex path;
};
typedef struct TableEntry* Table;//数组
Table initTable(Vertex start, Graph g) {
Table t;
t = (Table)malloc(sizeof(struct TableEntry)*vexNum);
int i;
for (i = 0; i < vexNum; i++) {
t[i].dist = DBL_MAX;
t[i].known = 0;
t[i].path = NOTAVERTEX;
}
t[start].dist = 0;
return t;
}
void printPath(Vertex v, Table t) {
if (t[v].known == 1) {
if (t[v].path != NOTAVERTEX) {//
printPath(t[v].path, t);
printf("to ");
}
printf("%s ", nameRecord[v]);
}
else
printf("can not arrive");
}
Vertex smallestUnknownDistanceVertex(Table t) {
double min = DBL_MAX;
Vertex v = NOTAVERTEX;
for (int i = 0; i < vexNum; i++) {
if (t[i].dist < min && t[i].known == 0) {
min = t[i].dist;
v = i;
}
}
return v;
}
void dijkstra(Table t, Graph g) {
Vertex v, w;
for (;;) {
v = smallestUnknownDistanceVertex(t);
t[v].known = 1;
if (v == NOTAVERTEX)
break;
EdgeNodePtr p = getEdgeNodePtr(v, g);
while (p) {
w = getVex(p);
if (t[w].known == 0) {
if (t[v].dist + getWeight(p) < t[w].dist) {
t[w].dist = t[v].dist + getWeight(p);
t[w].path = v;
}
}
p = advance(p);
}
}
for (int i = 0; i < vexNum; i++) {
printPath(i, t);
printf("\n");
}
}
int main() {
freopen("filein.txt", "r", stdin);
Graph g = readGraph();
Table t = initTable(0, g);
dijkstra(t, g);
}
struct TableEntry {
int known;
double dist;
Vertex path;
};
typedef struct TableEntry* Table;//数组
Table initTable(Vertex start, Graph g) {
Table t;
t = (Table)malloc(sizeof(struct TableEntry)*vexNum);
int i;
for (i = 0; i < vexNum; i++) {
t[i].dist = DBL_MAX;
t[i].known = 0;
t[i].path = NOTAVERTEX;
}
t[start].dist = 0;
return t;
}
void printPath(Vertex v, Table t) {
if (t[v].known == 1) {
if (t[v].path != NOTAVERTEX) {//
printPath(t[v].path, t);
printf("to ");
}
printf("%s ", nameRecord[v]);
}
else
printf("can not arrive");
}
Vertex smallestUnknownDistanceVertex(Table t) {
double min = DBL_MAX;
Vertex v = NOTAVERTEX;
for (int i = 0; i < vexNum; i++) {
if (t[i].dist < min && t[i].known == 0) {
min = t[i].dist;
v = i;
}
}
return v;
}
void dijkstra(Table t, Graph g) {
Vertex v, w;
for (;;) {
v = smallestUnknownDistanceVertex(t);
t[v].known = 1;
if (v == NOTAVERTEX)
break;
EdgeNodePtr p = getEdgeNodePtr(v, g);
while (p) {
w = getVex(p);
if (t[w].known == 0) {
if (t[v].dist + getWeight(p) < t[w].dist) {
t[w].dist = t[v].dist + getWeight(p);
t[w].path = v;
}
}
p = advance(p);
}
}
for (int i = 0; i < vexNum; i++) {
printPath(i, t);
printf("\n");
}
}
int main() {
freopen("filein.txt", "r", stdin);
Graph g = readGraph();
Table t = initTable(0, g);
dijkstra(t, g);
}
相关文章推荐
- 文章标题
- C#中MessageBox用法大全
- svn插件Subclipse
- PHP导出数据到CSV文件函数/方法
- 160706、Java HashMap工作原理及实现
- 删除字符串中出现次数最少的字符
- Qt5中文乱码问题
- Merge Sorted Array
- 【sublime text 开发常用插件】
- 查看编译后的calss文件编译jdk版本
- linux(centos)搭建SVN服务器
- struts2 s:if标签以及 #,%{},%{#}的使用方法等
- 电影分享
- Windows主机里利用VMware安装Linux(CentOS)虚拟机,Host-only连接上网方式详解
- 160705、总结:commons-codec.jar中常用方法
- 音乐分享
- CentOS Linux系统下更改Apache默认网站目录
- 160704、commons-beanutils.jar常用方法
- 简单使用Junit
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解