Description
编写程序,实现以邻接表作存储结构,求从源点到其余各顶点的最短路径的Dijkstra算法。
Input
第一行输入顶点数n和边数m;第二行输入顶点信息;分m行输入m对顶点vi,vj(表示由顶点vi到顶点vj(i不等于j)的边)以及该弧的权值。(0<m,n<100)
Output
输出从源点到其余各顶点的最短路径(不可达用-1表示)。
-
Sample Input
6 11 1 2 50 1 3 10 1 5 45 2 3 15 2 5 10 3 1 20 3 4 15 4 2 20 4 5 35 5 4 30 6 4 3
-
Sample Output
1 3 10 1 4 25 1 2 45 1 5 45 1 6 -1
#include <stdio.h> #include <stdlib.h> #define INF 10000 typedef struct { int vexs[100]; int arcs[100][100]; int vexnum,arcnum; }ALGraph; int Getinfo(ALGraph &G,int j) { int i=0; for (i=0;i<G.vexnum; i++) { if (G.vexs[i]==j) { return i; } } return -1; } void create(ALGraph &G, int vex, int arc) { int i,j; G.vexnum = vex; G.arcnum = arc; for (i = 0; i < G.vexnum; i++) { G.vexs[i] = i + 1; } for(i=0; i<G.vexnum; i++) { for(j=0; j<G.vexnum; j++) { G.arcs[i][j] = INF; } } for(i = 0;i < G.arcnum;i++) { int v1,v2,w; scanf("%d %d %d",&v1,&v2,&w); int m=Getinfo(G, v1); int n=Getinfo(G, v2); G.arcs[m][n]=w; } } void Dijkstra(ALGraph &G,int v0,int *dist) { int visited[100]; int i,j; for(i=0; i<G.vexnum; i++) { visited[i]=0; dist[i]=G.arcs[v0][i]; } dist[v0]=0; visited[v0]=1; int k; for(i=1;i<G.vexnum;i++) { int mindist = INF; for(j=0; j<G.vexnum; j++) { if(!visited[j]) { if(dist[j]<mindist) { k = j; mindist = dist[j]; } } } visited[k]=1; for(j=0; j<G.vexnum; j++) { if (!visited[j]&&(mindist+G.arcs[k][j]<dist[j])) { dist[j]=mindist+G.arcs[k][j]; } } } } void BubbleSort(ALGraph &G, int *dist) { int i,j,temp; for(i=1; i<G.vexnum; i++) { for(j=1;j<G.vexnum-i;j++) { if(dist[j]>dist[j+1]) { temp=dist[j]; dist[j]=dist[j+1]; dist[j+1]=temp; temp=G.vexs[j]; G.vexs[j]=G.vexs[j+1]; G.vexs[j+1]=temp; } } } } void print(ALGraph &G,int *dist) { int i,j; for(i=1; i<G.vexnum; i++) { if(dist[i]!=INF) { printf("%d %d %d \n",G.vexs[0],G.vexs[i],dist[i]); } else { printf("%d %d -1 \n",G.vexs[0],G.vexs[i]); } } } int main() { ALGraph G; int dist[100]; int i,j; int vex,arc; scanf("%d %d",&vex,&arc); create(G,vex,arc); Dijkstra(G, 0, dist); BubbleSort(G,dist); print(G,dist); return 0; }
要求用邻接表……然而我死活调不出来……就投机用了这个QAQ