您的位置:首页 > 理论基础 > 数据结构算法

数据结构图的应用

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: