[洛谷]P3371 单源最短路径模板 Dijkstra

来源:互联网 发布:好听的网络名字 男孩 编辑:程序博客网 时间:2024/05/16 01:19
#include#include#define MAXN 10021#define INF 0x7fffffffusing namespace std;struct Edge {    int succ, value, next;};int n, m, s, t, flag;int h[MAXN], vis[MAXN], dist[MAXN];Edge graph[1000021];int main() {    scanf("%d%d%d", &n, &m, &s);//读入,n为点数,m为边数,s为起点     flag = n;//用于记录扩展次数的变量     for (int i=1; i<=m; i++) {        int a, b, c;        scanf("%d%d%d", &a, &b, &c);        graph[++t] = {b, c, h[a]};        h[a] = t;    } //读图     fill(dist+1, dist+n+1, INF);//赋各点到起点的距离为无穷大     dist[s] = 0;    while (flag--) {        int mini = INF, num = 0;        for (int i=1; i<=n; i++)            if (!vis[i]) {                num = dist[i] < mini ? i : num;                mini = min(mini, dist[i]);            }//找到还没被访问的与s距离最小的点num         vis[num] = 1;//将num扩展进集合         for (int i=h[num]; i; i=graph[i].next)            dist[graph[i].succ] = min(dist[graph[i].succ], dist[num] + graph[i].value);    }//对num的所有邻居更新dist     for (int i=1; i<=n; i++)        printf("%d ", dist[i]);//输出     puts("");//个人习惯,输出一个换行符,不写一样     return 0;}
原创粉丝点击