数据结构课程设计(医院选址)代码
2016-06-08 14:57
387 查看
#include <iostream> #include <stdio.h> using namespace std; #define MAXV 50 #define INF 1000000000 typedef int InfoType; //邻接矩阵存储方法 typedef struct { int n; int edges[MAXV][MAXV]; } MGraph; FILE *f_in;//输入 FILE *f_out;//输出 int n;//n个点 //狄克斯特拉算法 //递归输出 void Ppath(int path[],int i,int v) { int k; k = path[i]; if(k == v) //递归出口 return; Ppath(path,k,v); fprintf(f_out,"%d->",k); } //判断两点之间是否存在路径 int biaoji1=1,biaoji2=0; void Dispath(int dist[],int path[],bool s[],int n,int v) { int i; for(i = 0;i < n;i ++) { if(i == v) continue; if(s[i] == 1)//证明v到i存在最短一条路 { fprintf(f_out,"从%d到%d的最短距离为:%d ",v,i,dist[i]); fprintf(f_out,"路径为 : "); fprintf(f_out,"%d->",v); //递归入口 Ppath(path,i,v); fprintf(f_out,"%d\n",i); if(biaoji1 + 1 != n) { biaoji2+=dist[i];biaoji1++; } else { fprintf(f_out,"和为:%d\n",biaoji2); biaoji1=1;biaoji2=0; } } else fprintf(f_out,"从%d到%d不存在的路径\n",v,i); } } //path数组用来记录路径 //dist数组记录点v到其他任意点的最短距离 //s数组用来标记 void Dijkstra(MGraph g,int v) { int dist[MAXV],path[MAXV]; bool s[MAXV]; int mindis,i,j,u; for(i = 0;i < g.n;i ++) { dist[i] = g.edges[v][i]; //标记数组初始化 s[i] = 0; //path数组初始化 if(g.edges[v][i] < INF) path[i] = v; else path[i] = -1; } //循环进行的初始条件 s[v] = 1;dist[v] = 0; //Dijkstra算法核心 for(i = 0;i < g.n;i ++) { mindis = INF; for(j = 0;j < g.n;j ++) { if(!s[j] && dist[j] < mindis) { u = j; mindis = dist[j]; } } s[u] = 1; for(j = 0;j < g.n;j ++) { if(!s[j]) { if(g.edges[u][j] < INF && dist[u] + g.edges[u][j] < dist[j]) { dist[j] = dist[u] + g.edges[u][j]; path[j] = u; } } } } Dispath(dist,path,s,g.n,v); } //弗洛伊德算法 //递归输出 void Ppath1(int path[][MAXV],int i,int j) { int k; k = path[i][j]; if(k == -1) return;//递归出口 Ppath1(path,i,k); fprintf(f_out,"%d->",k); Ppath1(path,k,j); } //判断两点之间是否存在路径 void Dispath1(int A[][MAXV],int path[][MAXV],int n) { int i,j; for(i = 0;i < n;i ++) { for(j = 0;j < n;j ++) { if(i == j) continue; if(A[i][j] == INF) { if(i != j) fprintf(f_out,"从%d到%d不存在路径",i,j); } else { fprintf(f_out,"从%d到%d的最短距离为:%d ",i,j,A[i][j]); fprintf(f_out,"路径为 : "); fprintf(f_out,"%d->",i); Ppath1(path,i,j);//如果存在则进行递归输出 fprintf(f_out,"%d\n",j); } } } } //求邻接矩阵中任意两点之间的最短距离 void Floyd(MGraph g) { int A[MAXV][MAXV],path[MAXV][MAXV]; int i,j,k; //初始化 for(i = 0;i < g.n;i ++) { for(j =0;j < g.n;j ++) { A[i][j] = g.edges[i][j]; path[i][j] = -1; } } //Folyd算法核心 for(k = 0;k < g.n;k ++) { for(i = 0;i < g.n;i ++) { for(j = 0;j < g.n;j ++) { if(A[i][j] > A[i][k] + A[k][j]) { A[i][j] = A[i][k] + A[k][j]; path[i][j] = k; } } } } Dispath1(A,path,g.n); } //主函数 int main() { f_in = fopen("F:\\数据结构课程设计\\课程设计\\in.txt","r"); f_out = fopen("F:\\数据结构课程设计\\课程设计\\out.txt","w"); int i,j; char s[1010];//用来输入提示信息 fscanf(f_in,"%s",s);//输入提示信息 while(fscanf(f_in,"%d",&n)!=EOF/*cin>>n,n!=EOF*/) { MGraph g;//定义邻接矩阵 fscanf(f_in,"%s",s);//输入提示信息 //输入两个点之间的距离,若为无穷大,不存在 for(i = 0;i < n;i ++) for(j = 0;j < n;j ++) fscanf(f_in,"%d",&g.edges[i][j]); g.n = n;//点的个数 fprintf(f_out,"输出距离,最短路径和及路径\n");//输出提示信息 for(i=0;i<n;i++) //每个点查找最短路径 Dijkstra(g,i); fprintf(f_out,"%c%c%c%c",'\n','\n','\n','\n'); fprintf(f_out,"输出距离及路径\n"); Floyd(g); fprintf(f_out,"%c%c%c%c",'\n','\n','\n','\n'); } return 0; }
输入文件中数据(in.txt)
请输入带权有向图的顶点个数:
6
请输入带权有向图的邻接矩阵:
0 5 1000000000 7 1000000000 1000000000
1000000000 0 4 1000000000 1000000000 1000000000
8 1000000000 0 1000000000 1000000000 9
1000000000 1000000000 5 0 1000000000 6
1000000000 1000000000 1000000000 5 0 1000000000
3 1000000000 1000000000 1000000000 1 0
记得把in.txt和cpp文件还有输出文件放在一个文件夹,注意修改文件路径
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)