Dijkstra 求最短路径算法
2016-03-09 15:53
260 查看
#include <iostream>
using namespace std;
const int maxint = 99999;
const int maxnum = 100;
<
4000
br />
void Dijkstra(int n,int v,int * dist,int * prev,int c[maxnum][maxnum]){
bool s[maxnum];
for(int i =1; i<=n;i++){//初始化
dist[i] = c[v][i];
s[i] = 0;
if(dist[i] == maxint)
prev[i] = 0;
else
prev[i] = v;
}
dist[v] = 0;
s[v] =1;
for(int i =2;i<=n;i++){
int tmp = maxint;
int u = v;
for(int j = 1;j<=n;j++){
if((!s[j])&&dist[j]<tmp){
u = j;
tmp = dist[j];
}
}
s[u] = 1;
for(int j =1;j<=n;j++){
if((!s[j])&&c[u][j] < maxnum){
int newdist = dist[u] + c[u][j];
if(newdist < dist[j])
{
dist[j] = newdist;
prev[j] = u;
}
}
}
}
}
void searchPath(int * prev,int v,int u){
int que[maxnum];
int tot = 1;
que[tot] = u;
tot++;
int tmp = prev[u];
while(tmp != v){
que[tot] = tmp;
tot++;
tmp = prev[tmp];
}
que[tot] = v;
for(int i = tot;i>=1;i--){
if(i!=1)
cout<<que[i]<<"->";
else
cout<<que[i]<<endl;
}
}
int main(){
int dist[maxnum];
int prev[maxnum];
int c[maxnum][maxnum];
int n,line;
cout<<"输入节点数目:";
cin>>n;
cout<<"请输入路径数目:";
cin>>line;
for(int i =1;i<=n;i++)
for(int j =1;j<=n;j++)
c[i][j] = maxint;
cout <<"请输路径的权值:";
int p,q,len;
for(int i =1;i<=line;i++){
cin>>p>>q>>len;
if(len<c[p][q]);
c[p][q] = len;
//c[q][p] = len;
}
for(int i =1;i<=n;i++){
dist[i] = maxint;
}
for(int i =1;i<=n;i++){
for(int j =1;j<=n;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
Dijkstra(n,1,dist,prev,c);
cout << "源点到最后一个顶点的最短路径长度: " << dist
<< endl;
// 路径
cout << "源点到最后一个顶点的路径为: ";
searchPath(prev, 1, n);
return 0;
}
using namespace std;
const int maxint = 99999;
const int maxnum = 100;
<
4000
br />
void Dijkstra(int n,int v,int * dist,int * prev,int c[maxnum][maxnum]){
bool s[maxnum];
for(int i =1; i<=n;i++){//初始化
dist[i] = c[v][i];
s[i] = 0;
if(dist[i] == maxint)
prev[i] = 0;
else
prev[i] = v;
}
dist[v] = 0;
s[v] =1;
for(int i =2;i<=n;i++){
int tmp = maxint;
int u = v;
for(int j = 1;j<=n;j++){
if((!s[j])&&dist[j]<tmp){
u = j;
tmp = dist[j];
}
}
s[u] = 1;
for(int j =1;j<=n;j++){
if((!s[j])&&c[u][j] < maxnum){
int newdist = dist[u] + c[u][j];
if(newdist < dist[j])
{
dist[j] = newdist;
prev[j] = u;
}
}
}
}
}
void searchPath(int * prev,int v,int u){
int que[maxnum];
int tot = 1;
que[tot] = u;
tot++;
int tmp = prev[u];
while(tmp != v){
que[tot] = tmp;
tot++;
tmp = prev[tmp];
}
que[tot] = v;
for(int i = tot;i>=1;i--){
if(i!=1)
cout<<que[i]<<"->";
else
cout<<que[i]<<endl;
}
}
int main(){
int dist[maxnum];
int prev[maxnum];
int c[maxnum][maxnum];
int n,line;
cout<<"输入节点数目:";
cin>>n;
cout<<"请输入路径数目:";
cin>>line;
for(int i =1;i<=n;i++)
for(int j =1;j<=n;j++)
c[i][j] = maxint;
cout <<"请输路径的权值:";
int p,q,len;
for(int i =1;i<=line;i++){
cin>>p>>q>>len;
if(len<c[p][q]);
c[p][q] = len;
//c[q][p] = len;
}
for(int i =1;i<=n;i++){
dist[i] = maxint;
}
for(int i =1;i<=n;i++){
for(int j =1;j<=n;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
Dijkstra(n,1,dist,prev,c);
cout << "源点到最后一个顶点的最短路径长度: " << dist
<< endl;
// 路径
cout << "源点到最后一个顶点的路径为: ";
searchPath(prev, 1, n);
return 0;
}
相关文章推荐
- LCT的初步理解
- Spring框架开发包和IOC示例
- 关于 android.widget.Scroller 详解
- intent.getSerializableExtra(转)
- vim中注释多行和删除多行注释
- 控制飞机移动
- C# 在Word文档中生成条形码
- js的二级联动
- 对构建之法的一些问题
- Win10手写输入功能使用教程
- 1069. The Black Hole of Numbers (20)
- 2千万用户APP的开发运营流程
- HDFS缓存集中管理特性:Centralized Cache Management
- 插件模式
- DOS命令行简单用法
- C++ 获取并判断操作系统版本,解决Win10、 Windows Server 2012 R2 读取失败的方案
- [ 转]Collections.unmodifiableList方法的使用与场景
- 递归
- 动态链接库dll 静态链接库lib 动态导入库lib
- xcode在真机调试的时候出现"The identity used to sign the executable is no longer valid"