迪杰斯特拉算法求最短路径的基本代码

include

define N 1005

using namespace std;

int n, m; //n代表顶点个数,m代表边的条数

bool str[N]; //用于判断顶点是否已经加入数组,默认都是false

int dis[N]; //用于存储每个顶点的权值,代表顶点a到这个顶点的最短距离

int g[N][N]; //g[1][2]代表顶点1到顶点2的距离

//核心!!!!
void dijkstra()
{
memset(dis, INT_MAX, sizeof(dis));
dis[1] = 0; //顶点1到顶点1的距离设为0

for (int i = 0; i <= n; i++)
{
int temp = 0; //最后它表示找到的节点
for (int j = 1; j <= n; j++)
{
if (!str[j] && ((temp == -1) || dis[j] < dis[temp])) //条件中的!str[j]是为了确保节点未被访问过,后面的temp==-1是为了第一次进入这个选择语句,接下来的条件判断都是dis[j]<dis[temp]
{
temp = j;
}
}

for (int j = 1; j <= n; j++) ///更新
{
dis[j] = min(dis[j],dis[temp] + g[temp][j]);
}

str[temp] = true;
}

for (int i = 1; i <= n; i++)
{
if (dis[i] == 0x3f3f3f3f) {
cout << -1 << " ";
}
}
}

int main()
{
memset(g, INT_MAX, sizeof(g)); //0x3f3f3f3f代表一个十六进制的数,代表无穷大
cin >> n >> m;
while (m--) //循环初始化边节点
{
int x, y, z; //x指的是初识节点,y指的是最终查找的节点,z指的是梁节点之间的距离
cin >> x >> y >> z;
g[x][y] = min(g[x][y], z);

}

return 0;
}

所有需要标注的东西全在图中,可以直接看

posted @ 2026-03-16 23:35  暗神酱  阅读(16)  评论(0)    收藏  举报