写了一个dijkstra的程序。
中间优先队列本来想用STL的priority_queue,然后发现它太不给力了。对这个应用环境不管用。就自己写了个Extract_min函数处理。
运行示例:
在data.txt文件中有下列数据。第一行表示有6个Node,后面6行是之间的权重,我们用-1表示无穷大。最后一行是单源搜索的起始Node。
6
0 -1 5 30 -1 -1
2 0 -1 -1 8 -1
-1 15 0 -1 -1 7
-1 -1 -1 0 -1 -1
-1 -1 -1 4 0 -1
-1 -1 -1 10 18 0
1
运行 "DIJKSTRA < data.txt" 则输出如下:
1 0
1
1 0 2
1 4 3
1 4
1 0 2 5
#include <set>
#include <iostream>
#include <list>
using namespace std;
#define INFINITE 0x7fff
int *d;
int *p;
int extract_min(list<int>& ls){
list<int>::iterator iter = ls.begin();
list<int>::iterator pos;
int elem = *iter;
int min = d[elem];
pos = iter;
for(;iter!=ls.end();iter++){
if(d[*iter]<min){
elem = *iter;
min = d[elem];
pos = iter;
}
}
ls.erase(pos);
return elem;
}
void dijkstra(int n,int **w,int s){
d = new int[n];
p = new int[n];
for(int i=0;i<n;i++){
d[i] = INFINITE;
p[i] = -1;
}
d[s] = 0;
set<int> S;
list<int> Q;
for(int i = 0;i<n;i++){
Q.push_back(i);
}
while(!Q.empty()){
int u = extract_min(Q);
S.insert(u);
for(int v=0;v<n;v++){
if(d[v]>d[u]+w[u][v]){
d[v] = d[u]+w[u][v];
p[v] = u;
}
}
}
}
void print_path(int s,int v){
if(v==s)
cout << s;
else if(p[v]==-1)
cout <<"no path from " <<s<<" to "<<v<<endl;
else{
print_path(s,p[v]);
cout << '\t' << v;
}
}
int main(){
int n;
int start;
cout << "enter the number of nodes:";
cin >>n;
cout <<endl<<"enter the w(u,v) s:"<<endl;
int **w = new int *[n];
for(int i=0;i<n;i++)
w[i] = new int[n];
for(int i =0;i<n;i++){
for(int j=0;j<n;j++){
cin >> w[i][j];
if(w[i][j]==-1)
w[i][j] = INFINITE;
}
}
cout<<endl<<"enter the number of start node:";
cout << endl;
cin >> start;
dijkstra(n,w,start);
for(int i = 0;i<n;i++){
print_path(start,i);
cout << endl;
}
return 0;
}