实现对图的一个指定的操作或用图解决一个应用问题
2010-05-08 20:24
543 查看
问题描述:n个村庄之间的无向图,边上的权值w(i,j)表示村庄i和j之间道路长度.现要从这n个村庄中选择一个村庄新建一所医院,使离医院最远的村庄到医院的路程最短.设计一程序求解此问题.
基本要求:用邻接矩阵表示无向网,应显示所选中的村庄到各村庄的最短距离及路径。
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
#define INFINITY 100000 //最大值,表示两顶点不邻接
#define MAX_VERTEX_NUM 20 //最大顶点个数
typedef struct Arcell
{
double adj;
}Arcell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//定义邻接矩阵
typedef struct
{
string verx[MAX_VERTEX_NUM];//定义顶点向量
AdjMatrix arcs;
int vexnum,arcnum;
}MGraph;//定义无向图
int LocateVex(MGraph &G,string v)
{
int i=0;
for(i;i<G.vexnum;i++)
{
if(G.verx[i]==v)
return i;
}
return -1;
}
int CreateUDN(MGraph &G)
{
int i,j,k; string v1,v2;double w;
cout<<"请输入村庄的数目"<<endl;
cin>>G.vexnum;
cout<<"请输入村庄之间直接相通的道路数"<<endl;
cin>>G.arcnum;
for( i=0;i<G.vexnum;i++)
{
cout<<"请输入村庄"<<i+1<<"的名称"<<endl;
cin>>G.verx[i];
}
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j].adj=INFINITY;
//初始化邻接矩阵
for(k=0;k<G.arcnum;k++)
{
cout<<"请输入第"<<k+1<<"线路的起点,终点,以及权值"<<endl;
cin>>v1>>v2>>w;
i=LocateVex(G,v1);j=LocateVex(G,v2);
G.arcs[i][j].adj=w;
G.arcs[j][i].adj=G.arcs[i][j].adj;
}
return 0;
}
void ShortestPath_FLOYD(MGraph G,string P[][20],double D[][20])
{
int v,w,u;
for(v=0;v<G.vexnum ;v++)
for(w=0;w<G.vexnum ;w++)
{
D[v][w]=G.arcs[v][w].adj ;
if(D[v][w]<INFINITY)
P[v][w]=G.verx[v]+"-->"+G.verx[w];//初始化路径数组
}
for(u=0;u<G.vexnum ;u++)
for(v=0;v<G.vexnum ;v++)
for(w=0;w<G.vexnum ;w++)
{
if(D[v][u]+D[u][w]<D[v][w])
{
D[v][w]=D[v][u]+D[u][w];
P[v][w]=P[v][u]+"-->"+G.verx[w];
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
MGraph G;int i,j;double a[MAX_VERTEX_NUM]={0};string P[20][20];double D[20][20];double min=INFINITY ;
CreateUDN(G);
ShortestPath_FLOYD( G, P, D);
for(i=0;i<G.vexnum ;i++)
for(j=0;j<G.vexnum ;j++)
{
if(a[i]<D[i][j])
a[i]=D[i][j];
}
for(i=0;i<G.vexnum ;i++)
{
if(a[i]<min)
j=i;
}
cout<<"医院应建在村庄"<<G.verx[j]<<"处"<<endl;
for(i=0;i<G.vexnum ;i++)
{
if(i!=j)
{
cout<<"村庄"<<G.verx[i]<<"到医院的距离为"<<D[j][i]<<" ";
cout<<"路径为"<<P[j][i]<<endl;
}
}
return 0;
}
基本要求:用邻接矩阵表示无向网,应显示所选中的村庄到各村庄的最短距离及路径。
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
#define INFINITY 100000 //最大值,表示两顶点不邻接
#define MAX_VERTEX_NUM 20 //最大顶点个数
typedef struct Arcell
{
double adj;
}Arcell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//定义邻接矩阵
typedef struct
{
string verx[MAX_VERTEX_NUM];//定义顶点向量
AdjMatrix arcs;
int vexnum,arcnum;
}MGraph;//定义无向图
int LocateVex(MGraph &G,string v)
{
int i=0;
for(i;i<G.vexnum;i++)
{
if(G.verx[i]==v)
return i;
}
return -1;
}
int CreateUDN(MGraph &G)
{
int i,j,k; string v1,v2;double w;
cout<<"请输入村庄的数目"<<endl;
cin>>G.vexnum;
cout<<"请输入村庄之间直接相通的道路数"<<endl;
cin>>G.arcnum;
for( i=0;i<G.vexnum;i++)
{
cout<<"请输入村庄"<<i+1<<"的名称"<<endl;
cin>>G.verx[i];
}
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j].adj=INFINITY;
//初始化邻接矩阵
for(k=0;k<G.arcnum;k++)
{
cout<<"请输入第"<<k+1<<"线路的起点,终点,以及权值"<<endl;
cin>>v1>>v2>>w;
i=LocateVex(G,v1);j=LocateVex(G,v2);
G.arcs[i][j].adj=w;
G.arcs[j][i].adj=G.arcs[i][j].adj;
}
return 0;
}
void ShortestPath_FLOYD(MGraph G,string P[][20],double D[][20])
{
int v,w,u;
for(v=0;v<G.vexnum ;v++)
for(w=0;w<G.vexnum ;w++)
{
D[v][w]=G.arcs[v][w].adj ;
if(D[v][w]<INFINITY)
P[v][w]=G.verx[v]+"-->"+G.verx[w];//初始化路径数组
}
for(u=0;u<G.vexnum ;u++)
for(v=0;v<G.vexnum ;v++)
for(w=0;w<G.vexnum ;w++)
{
if(D[v][u]+D[u][w]<D[v][w])
{
D[v][w]=D[v][u]+D[u][w];
P[v][w]=P[v][u]+"-->"+G.verx[w];
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
MGraph G;int i,j;double a[MAX_VERTEX_NUM]={0};string P[20][20];double D[20][20];double min=INFINITY ;
CreateUDN(G);
ShortestPath_FLOYD( G, P, D);
for(i=0;i<G.vexnum ;i++)
for(j=0;j<G.vexnum ;j++)
{
if(a[i]<D[i][j])
a[i]=D[i][j];
}
for(i=0;i<G.vexnum ;i++)
{
if(a[i]<min)
j=i;
}
cout<<"医院应建在村庄"<<G.verx[j]<<"处"<<endl;
for(i=0;i<G.vexnum ;i++)
{
if(i!=j)
{
cout<<"村庄"<<G.verx[i]<<"到医院的距离为"<<D[j][i]<<" ";
cout<<"路径为"<<P[j][i]<<endl;
}
}
return 0;
}
相关文章推荐
- CAS操作实现并发的优势、以及实现一个无锁队列、怎样解决ABA 问题
- 使用PLSQL Developer时,“ORA-12154: TNS:无法解析指定的连接标识符”问题的一个解决办法
- 使用PLSQL Developer时,“ORA-12154: TNS:无法解析指定的连接标识符”问题的一个解决办法
- 一个mysql解决的问题:游标、字符串操作 类似另一篇 sql
- 删除某一个指定类型的控件,及解决部分cell的重用问题
- 解决"操作必须使用一个可更新的查询"问题
- Qt5.4.2实现一个简单的浏览器 及相关问题的解决
- 一个实际问题分析及解决之九:什么是应用服务器
- 完美解决Android在listview添加checkbox实现单选多选操作问题
- 一个“解决一个第三方应用一个功能打不开的问题”思路。
- 实现一些字符串操作标准库函数、解决一些字符串问题
- 关于Excel操作编写的一个软件设计构思案例[连载] --如何实现从字符串中提取需要的字符并赋值给指定单元格内
- Android 软键盘弹出时布局内指定内容上移实现及问题解决
- 完美解决Android在listview添加checkbox实现单选多选操作问题
- 一个操作系统的实现--mount错误解决办法--mount 您必须指定文件系统的类型
- 机房重构所遇问题"未能载入文件或程序集“DAL”或它的某一个依赖项。系统找不到指定的文件"的解决的方法集锦
- 用win32实现的一个拷贝--主要是解决宽字节问题
- 64位win7下PL/SQL Developer 报“ORA-12154: TNS:无法解析指定的连接标识符”问题的一个解决办法
- 完美解决Android在listview添加checkbox实现单选多选操作问题
- 完美解决Android在listview添加checkbox实现单选多选操作问题