单源最短路径问题(Dijkstra算法)第五集
2010-07-28 12:29
429 查看
//单源最短路径问题(Dijkstra算法) //采用邻接矩阵 /*#include<stdio.h> #include<stdlib.h> #define N 1000 #define MAX 100 int s[MAX],dist[MAX],path[MAX]; typedef struct { int n,e; int egde[MAX][MAX]; }matrix_graph; matrix_graph *g=(matrix_graph*)malloc(sizeof(matrix_graph)); void Dijkstra(int v0) { int i,j,min,u; for(i=1;i<g->n;i++) { min=N; for(j=0;j<g->n;j++) { if(!s[j]&&dist[j]<min) { u=j; min=dist[j]; } } s[u]=1; for(j=0;j<g->n;j++) { if(!s[j]&&g->egde[u][j]<N&&g->egde[u][j]+dist[u]<dist[j]) { dist[j]=dist[u]+g->egde[u][j]; path[j]=u; } } } return ; } void output(int v) { int i; for(i=0;i<g->n;i++) { if(i!=v) { printf("from %d to %d dist is %d /n",v,i,dist[i]); } } return ; } int main() { int i,u,v,k; scanf("%d%d",&g->n,&g->e); //初始化邻接矩阵 for(v=0;v<g->n;v++) for(u=0;u<g->n;u++) { if(v==u)g->egde[u][v]=0; else g->egde[u][v]=N; } for(i=0;i<g->e;i++) { scanf("%d%d%d",&u,&v,&k); g->egde[u][v]=k; } scanf("%d",&v); //初始化 for(i=0;i<g->n;i++) { dist[i]=g->egde[v][i]; s[i]=0; if(i!=v&&dist[i]<N)path[i]=v; else path[i]=-1; } Dijkstra(v); output(v); return 0; } */ //采用邻接表 #include<stdio.h> #include<stdlib.h> #define N 100 #define MAX 10000 typedef struct node { int adjver,power; struct node *next; }egdeNode ; typedef struct { int vertex; egdeNode *link; }vernode; typedef struct { int n,e; vernode adjlist ; }link_graph; int s ,dist ,path ; void create(link_graph *ge) { int i,u,v,k; egdeNode *p; scanf("%d%d",&ge->n,&ge->e); for(i=0;i<ge->n;i++) { ge->adjlist[i].vertex=i; ge->adjlist[i].link=0; } for(i=0;i<ge->e;i++) { scanf("%d%d%d",&v,&u,&k); p=(egdeNode*)malloc(sizeof(egdeNode)); p->adjver=u; p->power=k; p->next=ge->adjlist[v].link; ge->adjlist[v].link=p; } } void dijkstra(link_graph *ge,int vo) { int i,j,min,u; egdeNode *p; //初始化 for(i=0;i<ge->n;i++) { s[i]=0; dist[i]=N; path[i]=-1; } s[vo]=1;dist[vo]=0; p=ge->adjlist[vo].link; while(p) { dist[p->adjver]=p->power; path[p->adjver]=1; p=p->next; } for(i=1;i<ge->n;i++) { min=N; for(j=0;j<ge->n;j++) { if(!s[j]&&dist[j]<min) { min=dist[j]; u=j; } } s[u]=1; p=ge->adjlist[u].link; while(p) { j=p->adjver; if(!s[j]&&dist[j]>dist[u]+p->power) { dist[j]=dist[u]+p->power; path[j]=u; } p=p->next; } } return ; } void output(link_graph *ge ,int vo) { int i; for(i=0;i<ge->n;i++) { if(i!=vo) { printf("form %d to %d list is %d /n",vo,i,dist[i]); } } return ; } int main() { int vo; link_graph *ge=(link_graph*)malloc(sizeof(link_graph)); create(ge); scanf("%d",&vo); dijkstra(ge,vo); output(ge,vo); return 0; }
相关文章推荐
- Dijkstra算法——单源最短路径问题
- HDU 3790 最短路径问题(单源最短路---Dijkstra算法)
- 每日一题 No.48 单源最短路径问题2(Dijkstra算法)
- Dijkstra算法是解单源最短路径问题的一个贪心算法
- 单源最短路径问题之dijkstra算法
- Dijkstra算法讲解(单源最短路径问题求解)
- 最短路径问题-----单源Dijkstra算法()
- 单源最短路径问题(dijkstra算法 及其 优化算法(优先队列实现))
- 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
- 算法导论--单源最短路径问题(Dijkstra算法)
- 【算法】Dijkstra算法(单源最短路径问题) 邻接矩阵和邻接表实现
- 最短路径问题(求单源最短路径)Dijkstra算法
- 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
- 单源最短路径问题 Dijkstra算法
- 图——单源最短路径问题-dijkstra算法
- Dijkstra算法,Bellman-Ford算法和BFS算法解决有向图的单源最短路径问题
- 越獄之权值非负单源最短路径问题-Dijkstra算法
- 算法java实现--贪心算法--单源最短路径问题--Dijkstra算法
- 单源最短路径问题——Dijkstra算法
- 边上值非负的单源最短路径问题----Dijkstra算法