c语言总结

#include <stdio.h>
#include <stdlib.h>
#include <stdafx.h>
#include <malloc.h> 
#define INFINITY  9999                      /*最大值∞*/
#define MAX_VEX_NUM  30                     /*图的最大顶点数目*/
typedef struct{
    int  vexnum;                            /*图的当前顶点数目和弧(边)的数目*/
    int  adj[MAX_VEX_NUM][MAX_VEX_NUM];     /*邻接矩阵*/
}AdjGraph;



int createGraph(AdjGraph *G, int *start, int *end)/*读入数据,建立有向图*/
{
    int n, m, i, j, k, s, count;
    int temp[MAX_VEX_NUM];
    printf("输入旅游景点数目和公交线路条数:\n");
    scanf("%d %d",&n, &m);
    if(n<=1||m<1) return -1;
    printf("输入起始景点编号和终止景点编号:\n");
    scanf("%d %d",start,end);
    if(*start<0||*start>n-1||*end<0||*end>n-1) return -1;
    G->vexnum=n;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            G->adj[i][j]=INFINITY;           /*邻接矩阵初始化*/
    for(s=0;s<m;s++)
    {
        printf("请输入第%d条公交线路途经各景点的编号:\n",s+1);
        scanf("%d",&k);
        count=0;
        while(k!=-1)
        {    temp[count++]=k;     scanf("%d",&k);    }
        for(i=0;i<count-1;i++)
            for(j=i+1;j<count;j++)           /*当前线路中,从t[i]到t[j]有直达公交车*/
                G->adj[temp[i]][temp[j]]=1;
    }
    return 0;
}
int findMinmum(AdjGraph G,int start,int end) /*找出并返回图中从顶点start到end的最短路径*/
/*长度(最少上车次数)*/
{
    int s[MAX_VEX_NUM];                      /*s[i]==1表示已求出到达景点i的最少上车次数*/
    int i,j,u,*dist;
    int min;
    if(start==end) return 0;
    dist=(int *)malloc(sizeof(int));        /*存储start到各景点的最少上车次数*/
    for(i=0;i<G.vexnum;i++)
    {
        dist[i]=G.adj[start][i];            /*从start可直达的景点的上车次数置1*/
        s[i]=0;                             /*所有景点i的最少上车次数还未找到*/
    }
    s[start]=1;                             /*已求出到达景点start的最少上车次数*/
    dist[start]=0;                          /*从景点start到start的最少上车次数等于0*/
    for(i=0;i<G.vexnum;i++)
    {
        min=INFINITY;
        u=start;
        for(j=0;j<G.vexnum;j++)
            if(s[j]==0&&dist[j]<min)
                { min=dist[j];    u=j; }      /*u是从start出发能够到达的所有景点中上车次数最少者*/
        s[u]=1;                             /*已经找到从景点start到u的最少上车次数,将u加入集合s*/
        for(j=0;j<G.vexnum;++j)             /*更新当前情况下其他景点的最少上车次数*/
            if(s[j]==0&&min+G.adj[u][j]<dist[j])
                dist[j]=min+G.adj[u][j];
    }
    return dist[end];                       /*返回从景点start到景点end的最少上车次数*/
}
int main()
{
    int start,end,m,forshow;
    AdjGraph G;
    if(createGraph(&G,&start,&end)==-1)
    {
        printf("创建有向图失败!\n");
        return -1;
    }
    m=findMinmum(G,start,end);              /*求从start到end的最少上车次数*/
    if(m==0)
        printf("从景点%d到景点%d不需要乘车\n",start,end);
    else if(m<INFINITY)
        printf("从景点%d到景点%d的最少换车次数为:%d\n",start,end,m-1);
    else
        printf("无解!\n");
    scanf("%d",&forshow);
    return 0;
    
}

 

转载于:https://www.cnblogs.com/jdw513/p/5510019.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值