c语言最短路径问题

作者在 2009-05-31 16:47:32 发布以下内容

²      问题描述

交通网络中常常提出这样的问题:两地之间是否有路相通?在有多条通路的情况下,哪一条最短?以上问题就是带权图中求最短路径的问题。

²      基本要求

⑴用Dijkstra算法求最短路径,图中的顶点数n不得少于10个。

⑵用户输入源点和目标点后,程序应输出源点到目标点的最短路径,并计算出途中所需时间或花费的交通费用。

源程序:

#include <stdio.h>
#include <stdlib.h>
#define INFINITY 32767
#define MaxVertexNum 30
typedef char VertexType;
typedef int EdgeType;
typedef struct{
   VertexType vexs[MaxVertexNum];
   EdgeType edges[MaxVertexNum][MaxVertexNum];
   int n,e;
}MGraph;

typedef enum{
   FALSE,TRUE
}Boolean;

void CreateMGraph(MGraph *G)
{
 int i,j,k,w;
 printf("\nEnter n & e:\n");
 scanf("%d%d",&G->n,&G->e);
 for (i=0;i<G->n;i++)
    for (j=0;j<G->n;j++)
       G->edges[i][j]=INFINITY;
 printf("Enter edge(i & j)& weight:\n");
 for (k=0;k<G->e;k++)
    {
     scanf("%d%d%d",&i,&j,&w);
     G->edges[i][j]=w;
    }
}
void Dijkstra(MGraph *G,long D[],int P[],int s)
{
 int i,j,k,min;
 Boolean S[MaxVertexNum];
 for(i=0;i<G->n;i++)
  {
   S[i]=FALSE;
   D[i]=G->edges[s][i];
   if(D[i]<INFINITY)
      P[i]=s;
   else
      P[i]=-1;
  }
 S[s]=TRUE;
 D[s]=0;
 for(i=0;i<G->n-1;i++)
  {
   min=INFINITY;
   for(j=0;j<G->n;j++)
      if(!S[j]&&D[j]<min)
        {
         min=D[j];
         k=j;
        }
   if(min==INFINITY)
      return;
   S[k]=TRUE;
   for(j=0;j<G->n;j++)
      if(!S[j]&&(D[j]>D[k]+G->edges[k][j]))
        {
         D[j]=D[k]+G->edges[k][j];
         P[j]=k;
        }
  }
}
void Print(MGraph *G,int P[],long D[],int t)
{
 int i=0,pre,a[MaxVertexNum];
 long k=32767;
 if(D[t]==k)
   {
    printf("no way!\n");
    return;
   }
 printf("Distance:%ld,Path:",D[t]);
 a[i]=t;
 pre=P[t];
 while(pre!=-1)
  {
   a[++i]=pre;
   pre=P[pre];
  }
 for(;i>=0;i--)
   printf("%d  ",a[i]);
}
void main()
{
 void CreateMGraph(MGraph *G);
 void Dijkstra(MGraph *G,long D[],int P[],int s);
 void Print(MGraph *G,int P[],long D[],int t);
 long int D[MaxVertexNum];
 int P[MaxVertexNum],s,t,l=1,k=1;
 MGraph *G;
 CreateMGraph(G);
 do
  {
   printf("\n*****please make a choice*****\n");
   printf("1.search\n0.EXIT\n");
   printf("******************************\n");
   scanf("%d",&l);
   switch(l)
    {
     case 0:k=0;break;
     case 1:
            if(l==1)
             {
              printf("shu ru yuan dian & zhong dian:\n");
              scanf("%d%d",&s,&t);
             }
            Dijkstra(G,D,P,s);
            Print(G,P,D,t);
            break;
    }
  }while(k);
}

c语言 | 阅读 3141 次
文章评论,共0条
游客请输入验证码
浏览6174次
文章归档
最新评论