⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 source.c

📁 单源点最短路径算法 * 本程序用来实现单源点最短路径(E.Dijkstra)算法 * 在Turbo C2.0编译器下编译通过 * 算法过程中 * 每条边的两个顶点和权值由用户输入
💻 C
字号:
/**
 * @(#)source.c
 *
 *
 * @author ztssky
 * @version 1.00 2007/1/2
 * 说明如下:
 * 本程序用来实现单源点最短路径(E.Dijkstra)算法
 * 在Turbo C2.0编译器下编译通过
 * 算法过程中
 * 每条边的两个顶点和权值由用户输入,格式:1 2 20
 * 程序默认源点为第一个顶点
 * 算法完成后输出路径长度和路径上的顶点
 * 格式为:路径长度:目标顶点<-经过的顶点...<-源点
 */
#include<stdio.h>

#define N 7  /*顶点数*/
#define E 12  /*边数*/

#define INT_MAX 32767 /*边的权值不可能达到的值*/

void main()
{
	int arcs[N+1][N+1]; /*图的邻接矩阵*/
  int dist[N+1];  /*存放源点到各顶点的最短路径*/
  int path[N+1];  /*存放在最短路径上该顶点的前一顶点号*/
  int s[N+1];   /*已求得的在最短路径上的顶点的顶点号*/
  int i,j,w,k;
  int min,u,pre;
  for( i=1; i<=N;i++)/*初始化邻接矩阵*/
    for(j=1; j<=N; j++)
      if(i==j)arcs[i][j]=0;/*对角线上值为0*/
      else arcs[i][j]=INT_MAX;/*其他的值置为最大*/
  for(k=1; k<=E; k++)
  {
    scanf("%d %d %d",&i,&j,&w);/*输入第一个顶点、第二个顶点、边的权值*/
    arcs[i][j]=w;/*构造邻接矩阵*/
  }
  for(i=1; i<=N; i++)/*初始化成本和路径*/
  {
  	dist[i]=arcs[1][i];/*源点到各顶点的路径长度暂置为源点到该点的直接路径长度*/
    s[i]=0;
    if((i!=1)&&(dist[i]<INT_MAX))path[i]=1;
    else path[i]=0;/*路径置为空*/
  }
  s[1]=1; dist[1]=0;
  for(i=1;i<N;i++)/*主循环,E.Dijkstra算法*/
  {
    min=INT_MAX;u=1;
    for(j=1;j<=N;j++)
    if(!s[j]&&dist[j]<min){u=j,min=dist[j];}
    s[u]=1;
    for(w=1;w<=N;w++)
     if(!s[w]&&arcs[u][w]<INT_MAX&&dist[u]+arcs[u][w]<dist[w])
     	{dist[w]=dist[u]+arcs[u][w]; path[w]=u;}
  }
  for(i=1;i<=N;i++)/*输出算法的结果*/
  {
   if(i!=1)
   {
  	 printf("%d:",dist[i]);/*输出路径长度*/
  	 printf("%d",i);/*输出目标顶点*/
     pre=path[i];
     while(pre!=0)
     {
    	 printf("<-%d",pre);/*输出路径*/
       pre=path[pre];
     }
     printf("\n");
   }
  }
  getch();/*等待按键退出*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -