首页 > 代码库 > dijkstra模板
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; }
dijkstra模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。