迪杰斯特拉算法的具体应用

输出最短路径

输入格式:第一行输入节点数m,路径数n,起始节点s和目标节点d,接下来输入n行,每行代码包含三个数x,y,z,x是路径起始节点,y是路径结束节点,路径为双向,z表示路径的长度

输出格式:如果没有最短路径,输出“不可达,无最短路径”,如果有,输出“最短路径为:”后面紧跟路径长度

解决代码:

include

include

define N 505

define INF 0x3f3f3f3f

using namespace std;

int n, m;

int dis[N]; //表示到第N个节点的当前距离
bool str[N]; //表示第N个节点是否已经被访问
int g[N][N]; //例如g[1][2]表示节点1到节点2的距离

int dijkstra(int begin, int end)
{
memset(dis, INF, sizeof(dis));

dis[begin] = 0; //开始节点到自己的距离是0

for (int i = 0; i < n; i++)
{
int cur = -1; //开始时的当前节点就是begin所代表的节点

for (int j = 0; j < n; j++)
{
if (!str[j] && (cur == -1 || dis[cur] > dis[j]))
{
cur = j;
}
}

if (cur == -1) break;
str[cur] = true;

for (int j = 0; j < n; j++)
{
dis[j] = min(dis[j], dis[cur] + g[cur][j]);
}

}

return dis[end] == INF ? -1 : dis[end];

}

int main()
{
int s, d;

memset(g, INF, sizeof(g));

cin >> n >> m;

cin >> s >> d;

for (int i = 0; i < m; i++)
{
int x, y, z;
cin >> x >> y >> z;
g[x][y] = z;
g[y][x] = z;
}

int min_dist = dijkstra(s, d);
if (min_dist == -1) {
cout << "不可达, 无最短路径" << endl;
}
else {
cout << "最短路径为:" << min_dist;
}

return 0;
}

posted @ 2026-03-17 01:15  暗神酱  阅读(12)  评论(1)    收藏  举报