⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lrxxdlg.cpp

📁 采用Dijkstra算法和Floyd算法实现的简单医院选址系统
💻 CPP
字号:
// LrxxDlg.cpp : implementation file
//

#include "stdafx.h"
#include "yyxz.h"
#include "LrxxDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CLrxxDlg dialog


CLrxxDlg::CLrxxDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CLrxxDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CLrxxDlg)
	m_lrxxCza = _T("");
	m_lrxxCzb = _T("");
	m_lJjz = _T("");
	m_lrxxLczj = 0;
	m_Cs=1;
	m_k=0;
	m_j=0;
	m_i=0;
	m_lrxxXx = _T("这里显示你输入的信息");
	m_xXXx = _T("");
	//}}AFX_DATA_INIT
	for(int i=0;i<30;i++)
	GRA.vexs[i]=new CString;
}


void CLrxxDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CLrxxDlg)
	DDX_Text(pDX, IDC_EDIT_CZA, m_lrxxCza);
	DDX_Text(pDX, IDC_EDIT_CZB, m_lrxxCzb);
	DDX_Text(pDX, IDC_EDIT_LCZJ, m_lrxxLczj);
	DDX_Text(pDX, IDC_STATIC_XX, m_lrxxXx);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CLrxxDlg, CDialog)
	//{{AFX_MSG_MAP(CLrxxDlg)
	ON_BN_CLICKED(IDC_BUTTON_LRXXQD, OnButtonLrxxqd)
	ON_BN_CLICKED(IDC_BUTTON_KSXZ, OnButtonKsxz)
	ON_BN_CLICKED(IDC_BUTTON_LRXXOK, OnButtonLrxxok)
	ON_BN_CLICKED(IDC_BUTTON_CT, OnButtonCt)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLrxxDlg message handlers

void CLrxxDlg::OnButtonLrxxqd() 
{
	// TODO: Add your control notification handler code here
	CString str;
	if(GetDlgItemText(IDC_BUTTON_LRXXQD,str),str=="显示信息>>")
	{
		SetDlgItemText(IDC_BUTTON_LRXXQD,"隐藏信息<<");
	}
	else
	{
		SetDlgItemText(IDC_BUTTON_LRXXQD,"显示信息>>");
	}

	static CRect largeRect;
	static CRect smallRect;

	if(largeRect.IsRectNull())
	{
		CRect sepratorRect;
		GetWindowRect(&largeRect);
		GetDlgItem(IDC_SEPRATOR)->GetWindowRect(&sepratorRect);

		smallRect.left=largeRect.left;
		smallRect.top=largeRect.top;
		smallRect.right=sepratorRect.right;
		smallRect.bottom=largeRect.bottom;
	}

	if(str=="隐藏信息<<")
	{
		SetWindowPos(NULL,0,0,smallRect.Width(),smallRect.Height(),SWP_NOMOVE|SWP_NOZORDER);
	}
	else
	{
		SetWindowPos(NULL,0,0,largeRect.Width(),largeRect.Height(),SWP_NOMOVE|SWP_NOZORDER);
	}
}

void CLrxxDlg::OnButtonKsxz() 
{
	// TODO: Add your control notification handler code here
	m_pJgDlg=new CJgDlg;
	if((m_Cs-1)<GRA.arcnum)//判断道路数输入是否足够
	{
		MessageBox("输入的信息不完全,道路数不够");
	}
	else
	{
	if(m_jSFsxzCzdl==0)
	{
		FloydGetResult(GRA);//求解结果
	}
	else if(m_jSFsxzCzdl==1)
	{
		DjikstraGetResult(GRA);
	}
	//显示结果
	m_pJgDlg->m_jgResult="医院最好建在村庄"+*m_result;
	m_pJgDlg->m_jgResult=m_pJgDlg->m_jgResult+"\n\n";
	m_pJgDlg->m_jgResult=m_pJgDlg->m_jgResult+"邻接矩阵为:\n";
	m_pJgDlg->m_jgResult=m_pJgDlg->m_jgResult+m_lJjz;
	m_pJgDlg->m_jgResult=m_pJgDlg->m_jgResult+"\n";
	m_pJgDlg->m_jgResult=m_pJgDlg->m_jgResult+m_xXXx;
	CDialog::OnCancel();
	m_pJgDlg->DoModal();
	}
	
}

void CLrxxDlg::OnButtonLrxxok() 
{
	// TODO: Add your control notification handler code here

	UpdateData(TRUE);
	CString  szTemp;	
	if(m_Cs<=GRA.arcnum)
	{
		if(m_lrxxCza==""||m_lrxxCzb=="")
		{
			MessageBox("输入不能为空,请输入");
		}
		else if(m_lrxxCza==m_lrxxCzb)
		{
			MessageBox("您输入了相同的村庄,请输入不同的村庄");
		}
		else
		{
		szTemp.Format("%d",m_Cs);//数字转换为字符	
		m_lrxxXx="第"+szTemp;
		m_lrxxXx=m_lrxxXx+"组数据:\n";
		m_lrxxXx=m_lrxxXx+"村庄";
		m_lrxxXx=m_lrxxXx+m_lrxxCza;
		m_lrxxXx=m_lrxxXx+"到";
		m_lrxxXx=m_lrxxXx+"村庄";
		m_lrxxXx=m_lrxxXx+m_lrxxCzb;
		m_lrxxXx=m_lrxxXx+"的距离为";	   
		szTemp.Format("%d",m_lrxxLczj);  
		m_lrxxXx=m_lrxxXx+szTemp;
		CreateWXW(GRA);
		m_k++;
		m_i++;
		m_lrxxCza="";
		m_lrxxCzb="";
		m_lrxxLczj=0;
		++m_Cs;
		}
	}
	else
	{
		MessageBox("信息已输入完毕!");
	}
	UpdateData(FALSE);//更新对话框显示
}

void CLrxxDlg::OnButtonCt() 
{
	// TODO: Add your control notification handler code here
	CString  szTemp;
	if(m_Cs!=1)
		szTemp.Format("%d",m_Cs-1);
	else if(m_Cs==1)
	{
		szTemp.Format("%d",m_Cs);
		m_Cs--;
	}
	m_lrxxXx="请重新输入第"+szTemp;
	m_lrxxXx=m_lrxxXx+"组数据";

	m_lrxxCza="";
	m_lrxxCzb="";
	m_lrxxLczj=0;
	if(m_Cs>1)
		m_Cs--;
	if(m_i>=2)
	{
		m_k-=2;
		m_i-=2;
	}
	UpdateData(FALSE);
}

int CLrxxDlg::LocateVex(VAGraph G, CString *v)
{	//返回顶点v在图G中的位置,不存在则重新输入此顶点
	int vfind=-1;//顶点在图中找到与否的标志
	for(int i=0;i<G.vexnum;i++)
	{	
		if(*G.vexs[i]==*v)
		{
			vfind=i;//顶点找到,s赋i,退出循环
			break;
		}
	}
	return vfind;//返回顶点位置
}

//采用数组表示法,构造无向网
void CLrxxDlg::CreateWXW(VAGraph &GRA)
{	//采用数组表示法,构造无向网GRA
	int i,j,w;//定义循环变量
	lab[m_k]=m_lrxxCza;
	lab[++m_k]=m_lrxxCzb;
	if(m_j==0)//判断数组中是否已有元素
	{
		GRA.vexs[m_i]=&lab[--m_k];	//村庄a	
        //初始化邻接矩阵
		for(j=0;j<GRA.vexnum;++j)
		{
			if(m_i!=j)
				GRA.arcs[m_i][j]=LARGEST;
			else
				GRA.arcs[m_i][j]=0;//一个点到它自身的距离是0
		}
		GRA.vexs[++m_i]=&lab[++m_k];//村庄b
		for(j=0;j<GRA.vexnum;++j)
		{
			if(m_i!=j)
				GRA.arcs[m_i][j]=LARGEST;//初始两村之距最大
			else
				GRA.arcs[m_i][j]=0;//一个点到它自身的距离是0
		}
		m_j=1;
	}
	else 
	{	--m_k;
		if(LocateVex(GRA,&lab[m_k])==-1)
		{	
			GRA.vexs[m_i]=&lab[m_k];		
			for(j=0;j<GRA.vexnum;++j)
			{
				if(m_i!=j)
					GRA.arcs[m_i][j]=LARGEST;
				else
					GRA.arcs[m_i][j]=0;//一个点到它自身的距离是0
			}
		}
		else
			m_i--;	
		++m_k;
		if(LocateVex(GRA,&lab[m_k])==-1)
		{
			GRA.vexs[++m_i]=&lab[m_k];
			for(j=0;j<GRA.vexnum;++j)
			{
				if(m_i!=j)
					GRA.arcs[m_i][j]=LARGEST;
				else
					GRA.arcs[m_i][j]=0;//一个点到它自身的距离是0
			}
		}
		else
			m_i--;
	}
       //构造邻接矩阵
		CString *v1;
		CString *v2;//矩阵行和列
		v1=&lab[--m_k];
		v2=&lab[++m_k];
		w=m_lrxxLczj;
      //输入顶点v1、v2的名称,边v1v2的权值w
		i=LocateVex(GRA,v1);
		j=LocateVex(GRA,v2);
		GRA.arcs[i][j]=w;//边<v1,v2>的权值
		GRA.arcs[j][i]=GRA.arcs[i][j];//此矩阵是对称矩阵
}

//求最短路径长度
void CLrxxDlg::FloydGetResult(VAGraph GRA)//使用Floyd算法
{	//用Floyed算法求有向网G中个对顶点的最短路径长度D[v][w]
	int D[MAX_VEXNUM][MAX_VEXNUM];//最短路径的带权长度矩阵
	static int P[MAX_VEXNUM];//各顶点到最远点的距离P[]
	int v,u,w;
	for(v=0;v<GRA.vexnum;++v)//各对节点之间初始已知距离
	{
		for(w=0;w<GRA.vexnum;++w)
		{
			D[v][w]=GRA.arcs[v][w];//给矩阵赋值
		}
	}
	for(u=0;u<GRA.vexnum;++u)//求各对顶点的最短路径,如果直接的路径不是最短就找合路径
	{
		for(v=0;v<GRA.vexnum;++v)
		{
			for(w=0;w<GRA.vexnum;++w)	
			{
				if(D[v][u]+D[u][w]<D[v][w])//从v经u到w的一条路径更短
				{
					D[v][w]=D[v][u]+D[u][w];//路径之和,舍弃直接的路径
				}
			}
		}
	}
   //输出结果矩阵
	CString  szTemp;
	for(u=0;u<GRA.vexnum;++u)			
	{	
		for(v=0;v<GRA.vexnum;++v)
		{	//输出最短路径长度矩阵D[v][w],并求P[u]
			szTemp.Format("%d",D[u][v]); 
			m_lJjz=m_lJjz+szTemp;
			m_lJjz=m_lJjz+"\t";
			if(P[u]<D[u][v]) //求出每个顶点到其它顶点的距离最大值存于P[u]中
			{
				P[u]=D[u][v];
			}
		}
		m_lJjz=m_lJjz+"\n";
	}
   //求P[u]的最小值,并输出其对应的顶点信息
	int i,temp=LARGEST;
	for(u=0;u<GRA.vexnum;++u)//求P[u]的最小值,并记录它的位置
	{
		if(temp>P[u])
		{
			temp=P[u];
			i=u;//所选村庄顶点为P[u]对应的顶点
		}
	}
	m_result=GRA.vexs[i];//医院最好的选址
	for(u=0;u<GRA.vexnum;++u)//输出所选顶点到其它顶点的最短距离
	{
		if(u!=i)
		{
			szTemp.Format("%d",D[i][u]);
			m_xXXx=m_xXXx+"村庄";
			m_xXXx=m_xXXx+*m_result;
			m_xXXx=m_xXXx+"到";
			m_xXXx=m_xXXx+*GRA.vexs[u];
			m_xXXx=m_xXXx+"的距离为:";
			m_xXXx=m_xXXx+szTemp;
			m_xXXx=m_xXXx+"\n";
		}
	}
}



void CLrxxDlg::DjikstraGetResult(VAGraph GRA)//使用Djikstra算法
{
	int DD[MAX_VEXNUM][MAX_VEXNUM];//最短路径的带权长度矩阵
	int final[MAX_VEXNUM];//是否加入S集中
	static int P[MAX_VEXNUM];//到最远点的距离
	int D[MAX_VEXNUM];//源点到其它顶点的距离
	int i,j,v,u,w,min;
	for(i=0;i<GRA.vexnum;i++)
	{
		for(v=0;v<GRA.vexnum;v++)
		{
			final[v]=0;
			D[v]=GRA.arcs[i][v];
		}//for
		D[i]=0;final[i]=1;
		//开始主循环,每次求得v0到某个顶点v的最短路径,并将v加入到s集
		for(j=0;j<GRA.vexnum;j++)
		{
			min=LARGEST;
			for(w=0;w<GRA.vexnum;w++)
			{
				if(!final[w])
					if(D[w]<min)
					{
						v=w;//保存离v0最近的顶点的信息
						min=D[w];//w离v0最近
					}
			}
			final[v]=1;//离v0最近的v加入到s集
			for(w=0;w<GRA.vexnum;w++)//更新当前最短路径及距离
				if(!final[w]&&(min+GRA.arcs[v][w]<D[w]))//修改D[w]
				{
					D[w]=min+GRA.arcs[v][w];
				}//if
		}//for
		for(j=0;j<GRA.vexnum;j++)
		{
			DD[i][j]=D[j];
		}
	}//for
	//求出每个顶点到其它顶点的距离最大值存于P[u]中
	CString  szTemp;
	for(u=0;u<GRA.vexnum;++u)			
	{	
		for(v=0;v<GRA.vexnum;++v)
		{	//输出最短路径长度矩阵D[v][w],并求P[u]
			szTemp.Format("%d",DD[u][v]); 
			m_lJjz=m_lJjz+szTemp;
			m_lJjz=m_lJjz+"\t";
			if(P[u]<DD[u][v])
			{
				P[u]=DD[u][v];
			}
		}
		m_lJjz=m_lJjz+"\n";
	}
   //求P[u]的最小值,并输出其对应的顶点信息
	int temp=LARGEST;
	for(u=0;u<GRA.vexnum;++u)//求P[u]的最小值,并记录它的位置
	{
		if(temp>P[u])
		{
			temp=P[u];
			i=u;//所选村庄顶点为P[u]对应的顶点
		}
	}
	m_result=GRA.vexs[i];//医院最佳选址
	for(u=0;u<GRA.vexnum;++u)//输出所选顶点到其它顶点的最短距离
	{
		if(u!=i)
		{
			szTemp.Format("%d",DD[i][u]);
			m_xXXx=m_xXXx+"村庄";
			m_xXXx=m_xXXx+*m_result;
			m_xXXx=m_xXXx+"到";
			m_xXXx=m_xXXx+*GRA.vexs[u];
			m_xXXx=m_xXXx+"的距离为:";
			m_xXXx=m_xXXx+szTemp;
			m_xXXx=m_xXXx+"\n";
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -