#include <iostream>
#include <stack>
using namespace std;
const int N = 100;
int n, m; //城市个数及路线
const int INF = 1e7;
int maps[N][N];
bool flag[N];
int dist[N];
int p[N];
void findroute(int y)
{
stack<int> st;
int y0 = y;
while(p[y0] != -1)
{
st.push(p[y0]);
y0 = p[y0];
}
while(!st.empty())
{
cout << st.top() << "->";
st.pop();
}
cout << y << endl;
}
void Dijkstra(int x)
{
for(int i = 1; i <= n; i++)
{
flag[i] = false;
dist[i] = maps[x][i];
if(maps[x][i] == INF) p[i] = -1;
else p[i] = x;
}
dist[x] = 0;
flag[x] = true;
for(int i = 1; i <= n; i++)
{
int temp = INF, t = x;
for(int j = 1; j <= n; j++)
{
if(!flag[j] && temp > dist[j])
{
temp = dist[j];
t = j;
}
}
if(t == x) return ;
flag[t] = true;
for(int j = 0; j < n; j++)
{
if(!flag[j] && maps[t][j]<INF && dist[j] > maps[t][j]+dist[t])
{
p[j] = t;
dist[j] = maps[t][j]+dist[t];
}
}
}
}
int main()
{
int u, v, w, x, y;
cout << "input the counts of the city and route : ";
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
maps[i][j] = INF;
cout << "input the routes :" << endl;
for(int i = 0; i < m; i++)
{
cin >> u >> v >> w;
maps[u][v] = w;
}
cout << "input Source and destination: ";
cin >> x >> y;
Dijkstra(x);
if(dist[y] == INF) cout << "unreachable" << endl;
else
{
cout << "the shortest path is : " << dist[y] << endl;
cout << "route is : ";
findroute(y);
}
return 0;
}
dijkstra最短路径
最新推荐文章于 2024-06-06 20:23:22 发布