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;

}
posted @   Aloongyy  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示