狄斯奎諾(dijkstra 模板)
阿新 • • 發佈:2022-05-05
/*狄斯奎諾演算法(dijkstra)<鄰接表> */ #include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 0x3f3f3f3f #define NN 100000 struct stu { int v_num; /* 鄰接表編號*/ float len; /* 邊長*/ struct stu *next ; }; /*n表示節點個數,u-->表示源節點*/ stu gong[NN] ; void Dijkstra(int n,int u,float dis[],int p[]) { int i,j,t; float temp; bool *ss = ( bool *)malloc(sizeof(bool)) ; //逐步的放進ss{}集合中 stu * pstu; for(i=0;i<n;i++) //init(dis,p) { dis[i]=maxn; p[i]=-1; //表示前一個節點為root; ss[i]=false; //flase-->表示沒有在ss集合中 } if(!(pstu=gong[u].next)) //表示只有自己一個節點 return ; while(pstu) { dis[pstu->v_num] = pstu->len ; p[pstu->v_num] = u ; //表示該頂點 pstu=pstu->next; } dis[u]=0; ss[u]=true; //表示這個頂點在ss集合中 for(i=0;i<n;i++) { temp=maxn; t=u; for(j=0;j<n;j++) { if(!ss[j]&&temp>dis[j]) { temp=dis[j]; t=j; } } if(t==u) break; //說明沒有最路! ss[t]=true; pstu=gong[t].next; while(pstu) { if(!ss[pstu->v_num]&&dis[pstu->v_num]>dis[t]+pstu->len) { dis[pstu->v_num]=dis[t]+pstu->len; ss[pstu->v_num]=true; } pstu=pstu->next; } } free(ss); }