算法导论 单源最短路径 Dijkstra
2017-08-09 11:02
435 查看
#include <stdio.h> #include <stdlib.h> #include <limits.h> #include "FIB.h" //图节点 typedef struct VertexNode { char name; int key; VertexNode *p; pFNode pf; }Vertex,*pVertex; //图 typedef struct { int vn; int **E; pVertex *V; }Graph,*pGraph; //根据算法导论 图24-6 初始化图 pGraph initGraph() { pGraph g=(pGraph)malloc(sizeof(Graph)); g->vn=5; pVertex vs=(pVertex)malloc(sizeof(Vertex)); vs->name='s'; vs->key=0; vs->p=NULL; pVertex vt=(pVertex)malloc(sizeof(Vertex)); vt->name='t'; vt->key=INT_MAX; vt->p=NULL; pVertex vy=(pVertex)malloc(sizeof(Vertex)); vy->name='y'; vy->key=INT_MAX; vy->p=NULL; pVertex vx=(pVertex)malloc(sizeof(Vertex)); vx->name='x'; vx->key=INT_MAX; vx->p=NULL; pVertex vz=(pVertex)malloc(sizeof(Vertex)); vz->name='z'; vz->key=INT_MAX; vz->p=NULL; g->V=(pVertex*)malloc(g->vn*sizeof(pVertex)); g->V[0]=vs; g->V[1]=vt; g->V[2]=vx; g->V[3]=vy; g->V[4]=vz; g->E = (int**)malloc(g->vn*sizeof(int*)); for(int i=0;i<g->vn;i++) { g->E[i]=(int*)malloc(g->vn*sizeof(int)); } for(int i=0;i<g->vn;i++) { for(int j=0;j<g->vn;j++) { g->E[i][j]=INT_MAX; } } g->E[0][1]=20; g->E[0][2]=5; g->E[1][2]=2; g->E[1][3]=1; g->E[2][1]=3; g->E[2][3]=9; g->E[2][4]=2; g->E[3][4]=4; g->E[4][3]=6; g->E[4][0]=7; return g; } void relax(pGraph g,int u,int v,pFIB h) { //无边,不进行松弛 if(g->E[u][v]==INT_MAX) return; int sum,uk=g->V[u]->key,vk=g->V[v]->key,ew=g->E[u][v]; //根据规则,加上无穷等于无穷 if(uk==INT_MAX || ew==INT_MAX) sum=INT_MAX; else sum=uk+ew; if(vk>sum) { g->V[v]->key=sum; g->V[v]->p=g->V[u]; FIB_heap_decreaseKey(h,g->V[v]->pf,sum); } } void printKey(pGraph g) { for(int i=0;i<g->vn;i++) { printf("%c %d\n",g->V[i]->name,g->V[i]->key); } } void main() { pGraph g=initGraph(); pFIB h=make_FIB_heap(); for(int i=0;i<g->vn;i++) { pFNode pf=createNode(g->V[i]->key); g->V[i]->pf=pf; pf->vi=i; FIB_heap_insert(h,pf); } while(h->n>0) { pFNode uf=FIB_heap_extract_min(h); int u=uf->vi; for(int v=0;v<g->vn;v++) { if(g->E[u][v]<INT_MAX) relax(g,u,v,h); } } printKey(g); getchar(); }
相关文章推荐
- Dijkstra 单源最短路径
- 算法 单源最短路径Dijkstra
- 6.2--Dijkstra单源最短路径
- Dijkstra算法求单源最短路径Java实现
- //九度教程78 dijkstra算法之单源最短路径
- 算法导论学习笔记(18)——单源最短路径(Dijkstra算法实现)
- Dijkstra单源最短路径算法
- Dijkstra求解单源点最短路径
- 【专题】单源最短路径(Spfa,Dijkstra)
- 单源最短路径问题--Dijkstra
- Dijkstra 单源最短路径
- 单源最短路径 :Dijkstra 算法
- 单源最短路径Dijkstra、BellmanFord、SPFA【模板】
- Dijkstra单源最短路径
- Dijkstra算法求单源最短路径
- Dijkstra(单源最短路径问题)
- (阶段三 dijkstra温习1.3)HDU 1874 畅通工程续(用dijkstra求单源起点和单点终点的最短路径(起点和终点动态给出))
- 浅析最小生成树和单源最短路径的区别(含Prim、Kruskal、Dijkstra、Bellman-Ford)
- sicily1031-Campus(单源最短路径dijkstra)
- 洛谷 P3371 【模板】单源最短路径(Dijkstra + 堆优化)