c语言总结
2016-05-19 20:32
281 查看
#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; }
相关文章推荐
- MFC——工厂模式——计算器
- 【C程序设计语言(第二版)学习】++ndigit[c-'0']理解
- VS2010对C++11的支持列表(感觉大部分都不支持)
- C++ 实现反射机制
- 基于贝叶斯学习的自适应中文词组的联想输入原理及C++实现
- L1-003. 个位数统计(C++)
- 使用VS开发人员命令提示符查看C++虚函数表及类内存分布
- 回顾:C++开篇课堂
- C++之引用
- C语言链表各种操作
- 【转载】C++基本功和 Design Pattern系列 ctor & dtor
- C语言约瑟夫环链表
- java jni jbyteArray传参给c++
- 抽象工厂 C++实现
- c++学习书籍汇总
- C++ 中 ZeroMemory、memset 危险需慎用
- QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件
- C语言判断分支循环函数杂记
- 常量指针与指向常量的指针
- C语言数据类型杂记