#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include <algorithm>
#include <vector>
using namespace std;
typedef struct node {
int v;//顶点
int dis;//边权
}node;
const int maxn = 100;
const int INF = 1000000000;
vector<node> graph[maxn];
int n,m;//顶点个数和边的条数
int dp[maxn],MIN;
string ways[maxn] = {""};
bool visited[maxn] = { false };
void dijistra(int s)//s是源点
{
char c = s + '0';
//fill(ways, ways + n, c);
fill(dp, dp + n, INF);//每条边初始化为无穷远
dp[s] = 0;
ways[s] = c;
MIN = INF;//MIN保存距离当前顶点最近的点
//j = -1;
for (int i = 0; i < n; i++)//遍历n个点
{
int u = -1;
MIN = INF;
for (int j = 0; j < n; j++)
{
if (visited[j]==false&&dp[j] < MIN)
{
MIN = dp[j];
u= j;//u为即将加入visited数组的下一个点
//visited[u] = true;
}
}
if (u == -1)
return;
//对于所有u点能够到达的边,检查长度是否可以优化
visited[u] = true;
for (int i = 0; i < graph[u].size(); i++)
{
int v = graph[u][i].v;
if (visited[v] == false && dp[v] > dp[u] + graph[u][i].dis)
{
dp[v] = dp[u] + graph[u][i].dis;
char c = v + '0';
ways[v] = ways[u] + c;
}
}
}
}
int main()
{
int u, v, w, s;//u为起始边的顶点,v为到达边的顶点,w为边的权重,s为单源最短路径的起点
while (scanf("%d %d %d", &n,&m,&s) != EOF)
{
for (int i = 0; i < m; i++)
{
scanf("%d %d %d", &u, &v,&w);
node temp;
temp.v = v;
temp.dis = w;
graph[u].push_back(temp);
//graph[v].push_back(u);//无向图
}
dijistra(s);
for (int i = 0; i < n; i++)
printf("%d ", dp[i]);
}
return 0;
}
迪杰斯塔拉单源最短路径算法
最新推荐文章于 2024-10-09 20:23:29 发布