• dijkstra模板


    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <stdbool.h>
    #define maxedge 20000
    #define maxn 5000     //结点数
    #define inf 1<<28
    bool vist[maxn];
    struct Edge
    {
        int s;   //边的起点
        int t;   //边的终点
        int next;//当前下一条边的编号
        int w;  //边的权值
    }edge[maxedge];
    int headlist[maxedge]; //索引  head[i]存放已i为起点的“第一条”边
    int distance[maxn];
    int n,m,x;
    void dij()
    {
        int i,j,k;
        memset(vist,false,sizeof(vist));
        for(i=1;i<=n;++i)
         distance[i]=inf;
         distance[x]=0;
        for(i=1;i<=n;i++)
        {   k=-1;
            for(j=1;j<=n;j++)
              if(!vist[j]&&(k==-1||distance[k]>distance[j]))
                k=j;
            vist[k]=true;
            for(j=headlist[k];j!=-1;j=edge[j].next)
            if(!vist[edge[j].t]&&(distance[k]+edge[j].w<distance[edge[j].t]))
                distance[edge[j].t]=distance[k]+edge[j].w;
        }
        for(i=1;i<=n;i++)
        printf("%d ",distance[i]);
    }
    int main()
    {
        int i,a,b,c;
        while(~scanf("%d%d%d",&n,&m,&x))
        {
            for(i=1;i<=n;++i)
              headlist[i]=-1;
            for(i=1;i<=m;++i)
            {
                scanf("%d%d%d",&a,&b,&c);
                edge[i].s=a;
                edge[i].t=b;
                edge[i].w=c;
                edge[i].next=headlist[a];//索引:节点i 后一条边编号为headlist[a];
                headlist[a]=i;
    
            }
            dij();
        }
    
        return 0;
    }
  • 相关阅读:
    二叉树遍历
    nginx反向代理signalr
    SignalR入坑笔记
    CSS一些特殊图形
    Powershell下git中文乱码
    使用VisualStudio直接运行简单的C#语句
    wpf实现一个windows定时关机的工具
    Asp.NetCoreWebApi
    MySql权限丢失问题解决
    Systemd 入门教程:命令篇
  • 原文地址:https://www.cnblogs.com/new-hand/p/7277186.html
Copyright © 2020-2023  润新知