数据结构图的应用
2011-05-25 08:56
288 查看
问题描述:n个村庄之间的无向图,边上的权值w(i,j)表示村庄i和j之间道路长度.现要从这n个村庄中选择一个村庄新建一所医院,使离医院最远的村庄到医院的路程最短.设计一程序求解此问题.
基本要求:
用邻接矩阵表示无向网,应显示所选中的村庄到各村庄的最短距离。
万一你要用的话 改改函数名 变量名吧 。。。不然老师一看都一样。。。
基本要求:
用邻接矩阵表示无向网,应显示所选中的村庄到各村庄的最短距离。
万一你要用的话 改改函数名 变量名吧 。。。不然老师一看都一样。。。
#include <iostream> using namespace std; #define INF 32767 #define MaxVex 20 typedef enum {DG,DN,UDG,UDN}GraphKind; bool path[MaxVex][MaxVex]={}; bool final[MaxVex]; int D[MaxVex]={0}; int d[MaxVex]={0}; struct ArcCell{ int adj; int *info; }; struct Graph{ int vexs[MaxVex]; ArcCell arcs[MaxVex][MaxVex]; int vexnum,arcnum; GraphKind kind; }; int getmax(int *d,Graph a) { int result=0; for(int i=0;i<a.vexnum;i++) if(result<d[i])result=d[i]; return result; } int getmin(int *d,Graph a) { int result=d[0]; int i,j; for(i=0;i<a.vexnum;i++) if(result>d[i]){result=d[i];j=i;} return j; } void input(Graph *graph) { int n; cout<<"请输入顶点个数"; cin>>n; graph->vexnum=n; cout<<endl<<"请输入无向图的邻接矩阵,无穷时大请输入-1"; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { cout<<endl<<"arc["<<i<<"]["<<j<<"]="; cin>>graph->arcs[i][j].adj; if(graph->arcs[i][j].adj==-1)graph->arcs[i][j].adj=INF; /*if(i==j){graph->arcs[i][j].adj=0;cout<<endl<<"arc["<<i<<"]["<<j<<"]=0";} else if(graph->arcs[j][i].adj>0&&graph->arcs[j][i].adj<=INF){graph->arcs[i][j].adj=graph->arcs[j][i].adj;cout<<endl<<"arc["<<i<<"]["<<j<<"]="<<graph->arcs[j][i].adj;} else {cout<<endl<<"arc["<<i<<"]["<<j<<"]=";cin>>graph->arcs[i][j].adj;} if(graph->arcs[i][j].adj==-1)graph->arcs[i][j].adj=INF; */ } } void Dijkstra(Graph G,int v0) { int min,v,w; for(v=0;v<G.vexnum;++v){ final[v]=false; D[v]=G.arcs[v0][v].adj; for(int w=0;w<G.vexnum;++w) path[v][w]=false; if(D[v]<INF){path[v][v0]=true;path[v][v]=true;} }//for D[v0]=0; final[v0]=true; for(int i=1;i<G.vexnum;++i){ min=INF; for(w=0;w<G.vexnum;++w) if(!final[w]) if(D[w]<min){v=w;min=D[w];} final[v]=true; for(w=0;w<G.vexnum;++w) if( !final[w]&&(min+G.arcs[v][w].adj<D[w])){ D[w]=min+G.arcs[v][w].adj; for(int j=0;j<MaxVex;j++)path[w][j]=path[v][j]; path[w][w]=true; }//if }//for }//dij void shortpath(Graph a) { int result; for(int i=0;i<a.vexnum;i++) { Dijkstra(a,i); d[i]=getmax(D,a);//D[i]为始点到第i个点的最短路径 //d[i]为始点为i时到其他各点最短路径中的最长路径; } result=getmin(d,a); Dijkstra(a,result);//getmin(d)为结果,医院位置 for(int j=0;j<a.vexnum;j++) { cout<<endl<<"从医院(点"<<result+1<<")到村庄(点"<<j+1<<")最短距离为"<<D[j]<<"线路为"; int x=0; for(int i=0;i<a.vexnum;i++) { if(path[j][i]==true) { x++; if(x>1)cout<<"->"; cout<<i+1; } } } } void main() { Graph a; input(&a); shortpath(a); }
相关文章推荐
- 数据结构之串的应用
- 数据结构之栈的应用(迷宫问题)
- 数据结构实验之串三:KMP应用
- 解析WPF绑定层次结构数据的应用详解
- COM+(三层结构)应用中数据访问的技术(E)
- 数据结构之链式队列与链式栈的应用-球钟问题
- 数据结构课程设计报告 二叉树的应用
- 数据结构实验之串一:KMP简单应用
- 数据结构上机时间第三周项目4(1)—顺序表应用
- 数据结构实验之串三:KMP应用
- 数据结构与算法面试题汇编(1)- 链表的操作与应用
- 8、数据结构笔记之八栈的应用之括号匹配检验实现
- 关于bitmap结构的大数据场景应用
- 数据结构实验之串一:KMP简单应用
- 数据结构顺序表应用1:多余元素删除之移位算法
- SDUT 2772 数据结构实验之串一:KMP简单应用
- 看数据结构写代码(11)栈的应用(二) 括号匹配的检查
- 数据结构课程设计,五种结构的相关操作和应用
- 数据结构之线性表的静态单链表存储结构(应用求集合(A-B)&&(B-A))
- 【数据结构】实验二:栈与队列的应用---表达式求值