您的位置:首页 > 编程语言 > C语言/C++

Dijkstra算法的C++实现

2014-05-20 17:19 246 查看
#include <iostream>
#include <vector>
#include <queue>
#define MAX_VALUE 1000

using namespace std;

int **a;
int num_ver;
int *pre;

void init();//初始化全局变量
void readData();//读取数据
void ShortPath(int v);//寻找最短路径
void printPath(int pre[],int v,int u);//输出最短路径
int findMin(int dis[],bool s[]);//寻找下一个最短的路径

void init()
{
cout << "Please input the number of vertexs:";
cin >> num_ver;
a = new int*[num_ver];
for(int i = 0; i < num_ver; i++)
{
a[i] = new int[num_ver];
}
pre = new int[num_ver];
}

void readData()
{
cout << "Please input the adjacency matrix:" << endl;
for(int i = 0; i < num_ver; i++)
{
for(int j = 0; j < num_ver; j++)
{
cin >> a[i][j];
}
}
}

void ShortPath(int v)
{
int dis[num_ver];
bool s[num_ver];
int u;

for(int i = 0; i < num_ver; i++)
{
if(i != v)
{
s[i]=0;
dis[i] = a[v][i];
if(dis[i] == MAX_VALUE)
{
pre[i] = -1;
}
else
{
pre[i] = v;
}
}
}

s[v] = 1;//选中V节点
dis[v] = 0;
for(int i = 1; i < num_ver; i++)
{
u = findMin(dis,s);//找下一个最短的路径
s[u] = 1;
for(int j = 1; j < num_ver; j++)//更新链接矩阵
{
if(s[j] == 0&&dis[u] + a[u][j] < dis[j])
{
dis[j] = dis[u]+a[u][j];
pre[j] =u;
}

}
}
}

int findMin(int dis[],bool s[])
{
int min;
int i,k;
for(i = 0; s[i] == 1&&i < num_ver; i++);
min = dis[i];
k = i;
for(i = i + 1; i < num_ver; i++)
{
if(s[i] == 0&&dis[i] < min)
{
k = i;
min = dis[i];
}
}
return k;
}

void printPath(int pre[],int v,int u)
{
queue<int> que;
int tmp = u;
while(tmp!=v)
{
que.push(pre[tmp]);
tmp = pre[tmp];
}
while(!que.empty())
{
cout<<que.front()<<'\t';
que.pop();
}
}

int main()
{
init();
readData();
ShortPath(0);
printPath(pre,0,num_ver - 1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: