P3371 【模板】单源最短路径(弱化版)
Dijkstra算法,用途:可以算出一个顶点到其余各顶点的最短距离,解决有权路径问题。时间复杂度O(n*n)。
核心思想:从起始点开始,采用贪心算法的策略,每次遍历到距离最近且为访问的顶点邻接节点,直到扩展到终点为止。
点击查看代码
#include <iostream>
#include <stack>
#include <cmath>
#include <algorithm>
#include <set>
#include <vector>
#include <climits>
#include <string.h>
#include <map>
#include <queue>
#include <list>
#include <cmath>
#include <iomanip>
#define int long long
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define lc u<<1
#define rc u<<1|1
#define gcd __gcd
#define double long double
#define endl "\n"
#define INF LLONG_MAX
#define mod 1000000007
#define N 100005
const double PI = 3.14159265358979323846;
using namespace std;
int n, m, s;
int dis[10005];
bool vis[10005];
struct Node { int v, w; };
vector<Node>vec[N];
void dijkstra()
{
fill(dis, dis + n + 1, INF);
fill(vis, vis, false);
dis[s] = 0;
for (int i = 1; i < n; i++)//贪心过程
{
int u = -1;
for (int j = 1; j <= n; j++)
{
if (!vis[j] && (u == -1 || dis[u] > dis[j]))u = j;
}
if (u == -1)break;
vis[u] = true;
for (auto v : vec[u])
{
if (dis[v.v] > dis[u] + v.w)//更新
{
dis[v.v] = dis[u] + v.w;
}
}
}
}
signed main()
{
ios;//会超时
cin >> n >> m >> s;
for (int i = 1; i <= m; i++)
{
int u, v, w; cin >> u >> v >> w;
vec[u].push_back({ v,w });
}
dijkstra();
for (int i = 1; i <= n; i++)
{
if (dis[i] == INF)cout << INT_MAX << " ";
else cout << dis[i] << " ";
}
return 0;
}