Dijkstra算法的C语言实现:文件读取、图的存储、算法实现、路径输出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dijkstra算法的C语言实现:文件读取、图的存储、算法实现、路径输出相关的知识,希望对你有一定的参考价值。
(1)输入是两个txt文件:
第一个文件格式,节点1 节点2 从节点1到节点2的边长,如:
Beijing Shanghai 120
Shanghai Guangzhou 230
第二个文件格式,起点1 起点2,如:
Beijing Guangzhou
Shanghai Wuhan
(2)读取这两个文件,将文本包涵的图存入C语言环境中,然后利用Dijkstra算法进行求解。
(3)输出第二个文件所有要求的最短路,存储为文件,输出文件格式:
Beijing Guangzhou:Beijing-Shanghai-Wuhan 350
Shanghai Wuhan:Shanghai-....-Wuhan 498
dij邻接阵
#include <algorithm>
#include <deque>
#include <queue>
#include <iostream>
using namespace std;
#define MN 1001
#define INF (1<<29)
int graf[MN][MN];
struct node
int v;
int dis;
node(int vv,int dd)v=vv;dis=dd;
node()
;
bool operator < (const node aa,const node bb)
return aa.dis>bb.dis;//最小堆
int dis[MN];
void dijkstra(int s,int n)//s是源点,[1..n]
node tmp;
int i,w;
for(i=1;i<=n;++i)dis[i]=INF;
priority_queue < node,deque<node> > Q;
Q.push(node(s,0));
for(dis[s]=0;!Q.empty();)
tmp=Q.top();Q.pop();
if(tmp.dis!=dis[tmp.v])continue;
for(i=1;i<=n;++i)
w=graf[tmp.v][i];
if(w!=INF&&dis[tmp.v]+w<dis[i])
//必要时可保存路径pre[i]=tmp.v
dis[i]=dis[tmp.v]+w;
Q.push(node(i,dis[i]));
参考技术A 点回车 参考技术B 看一下百度百科吧。
http://baike.baidu.com/view/7839.htm
或者到POJ上去找一些用Dijkstra算法来求解的题目,比如说:
http://poj.org/problem?id=3767
搞ACM的同学在这方面还是理解很深刻的。 参考技术C 有偿帮你写个。 参考技术D 貌似这种题要用LCA,不然很容易超时 第5个回答 2010-12-04 程序已经发给你咯O(∩_∩)O~本回答被提问者采纳
以上是关于Dijkstra算法的C语言实现:文件读取、图的存储、算法实现、路径输出的主要内容,如果未能解决你的问题,请参考以下文章