//单源最短路径问题(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[N]; }link_graph; int s[N],dist[N],path[N]; 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; }