zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    结构体和枚举
    [转载]玩转Asp.net MVC 的八个扩展点
    SQLServer处理亿万级别的数据的优化措施
    Lambda表达式
    匿名类型
    单例模式——懒汉式和饿汉式详解
    Cglib动态代理实现原理
    集合的子集
    深入剖析ThreadLocal
    java注解的自定义和使用
  • 原文地址:https://www.cnblogs.com/new-hand/p/7277186.html
Copyright © 2011-2022 走看看