迪杰斯特拉算法的具体应用
输出最短路径
输入格式:第一行输入节点数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;
}
浙公网安备 33010602011771号