算法——最短路径之Dijkstra

解决非负权边的最短路径问题时,Dijkstra算法还是不错的

不多bb,挂模板代码

没写注释,很好理解的

#include <cstdio>
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;

const int N = 100;
const int INF = 1e7;

int map[N][N],dist[N],p[N],n,m;
bool flag[N];

void Dijkstra( int u)
{
for( int i = 1; i <= n; i++)
{
dist[i] = map[u][i];
flag[i] = false;
if(dist[i] == INF)
{
p[i] = - 1;
}
else
{
p[i] = u;
}
}
dist[u] = 0;
flag[u] = true;

for( int i = 1; i <= n; i++)
{
int temp = INF, t = u;
for( int j = 1; j <= n; j++)
{
if(!flag[j] && dist[j] < temp)
{
t = j;
temp = dist[j];
}
}

if(t == u)
{
return;
}

flag[t] = true;
for( int j = 1; j <= n; j++)
{
if(!flag[j] && map[t][j] < INF)
{
if(dist[j] > dist[t] + map[t][j])
{
dist[j] = dist[t] + map[t][j];
p[j] = t;
}
}
}

}

}

void findPath( int u)
{
int x;
stack< int>s;
cout << "源点为 : " << u << endl;
for( int i = 1; i <= n; i++)
{
x = p[i];
while(x != - 1)
{
s. push(x);
x = p[x];
}
cout << "最短路径为 : ";
while(!s. empty())
{
cout << s. top() << "->";
s. pop();
}
cout << i << ", 最短距离为 : " << dist[i] <<endl;
}
}

int main()
{
int u,v,w,st;
cout << "请输入节点个数 通路个数" << endl;
cin >> n >> m;
for( int i = 1; i <= n; i++)
{
for( int j = 1; j <= n; j++)
{
map[i][j] = INF;
}
}
cout << "请输入三个数 u v w 代表从u到v到的路径为w" << endl;
for( int i = 1; i <= m; i++)
{
cin >> u >> v >> w;
map[u][v] = min(map[u][v], w);
}
cout << "请输入初始节点" << endl;
cin >> st;
Dijkstra(st);
// for(int i = 1; i <= n; i++){
// cout << st << "->" << i << endl;
// if(dist[i] == INF){
// cout << "没有路可以走." << endl;
// }else{
// cout << "最短路径为 : " << dist[i] << endl;
// }
// }
findPath(st);
return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值