标签:
ps:主要是3个一维数组,一个是dist[],用来储存源点到达各点的距离(比如dist[2]=3就是源点到达2的距离是3),一个是off[],是用来记录是否作为扩散点扩散了.
另一个是path[],用来记录到达某点的前驱点.然后就是构图了,map[a][b]=c;
代码:
#include "stdio.h" #include "string.h" #define MAX 1000000 int dist[100]; int off[100]; int map[100][100]; int path[100]; void mm(int a); int main(){ int n,m,i,j,k,a,b,c; int min1; scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ map[i][j]=MAX; } } for(i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); map[a][b]=c; map[b][a]=c; } scanf("%d",&a); for(i=1;i<=n;i++){ dist[i]=map[a][i]; //初始化 if(dist[i]==MAX){ path[i]=-1; } else path[i]=a; } dist[a]=0; //选择扩散点,并标记为1 off[a]=1; for(i=2;i<=n;i++){ min1=MAX; //k=a; for(j=1;j<=n;j++){ //找出扩散点附近尚未扩散过的点最短的距离 if((!off[j]) && dist[j]<min1){ k=j; min1=dist[j]; } } off[k]=1; //进行扩散,并标记 for(j=1;j<=n;j++){ if((!off[j]) &&map[k][j]<MAX){ if(dist[k]+map[k][j] < dist[j]){ dist[j]=dist[k]+map[k][j]; path[j]=k; } } } } for(i=1;i<=n;i++){ printf("到达%d的最短路径为%d\n",i,dist[i]); mm(i); } return 0; } void mm(int a){ int k=a; printf("%d",a); while(path[a]!=-1){ printf("->%d",path[a]); a=path[a]; } printf("\n"); }
标签:
原文地址:http://www.cnblogs.com/sureli/p/5366293.html