最小生成树.docx
- 文档编号:23607226
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:13
- 大小:53.93KB
最小生成树.docx
《最小生成树.docx》由会员分享,可在线阅读,更多相关《最小生成树.docx(13页珍藏版)》请在冰豆网上搜索。
最小生成树
MFC程序设计(求图的最小生成树)
2009年07月29日星期三下午04:
11
程序下载地址:
这个程序也是数据结构课程设计中的一题,求图的最小生成树,我也像上个程序一样,做了界面,使得图,可以用鼠标输入,输入界面如下所示:
当用户点击“绘制完成”时,就会出现下面的结果,即画出了得到的最小生成树:
实现上面的对话框其实是同一个对话框,但是有些键显示,在另一个情况下不显示,看以下两个函数就可以说明清楚:
voidCGraphDlg:
:
OnBnClickedClearAll()
{
//TODO:
在此添加控件通知处理程序代码
if(m_bDrawOrShow==false)
{
m_bDrawOrShow=true;
GetDlgItem(IDC_OBJECT)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_NODE)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_SIDE)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_INPUT_OK)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_CLEAR_ONCE)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_CLEAR_ALL)->SetWindowTextW(L"清除所有");
GetDlgItem(IDC_STATIC_SHOW)->SetWindowTextW(L"图形的绘制与显示");
for(inti=0;i if(m_gnors[i].bNorS==FALSE) m_gnors[i].bShow=TRUE; RedrawWindow(); ReDrawAll(); } else { m_num=0; m_type=0; m_n=0; RedrawWindow(); } } //////////////////////////////////////////////////////////////////////////////// voidCGraphDlg: : OnBnClickedInputOk() { //TODO: 在此添加控件通知处理程序代码 m_bDrawOrShow=false; GetDlgItem(IDC_OBJECT)->ShowWindow(SW_HIDE); GetDlgItem(IDC_NODE)->ShowWindow(SW_HIDE); GetDlgItem(IDC_SIDE)->ShowWindow(SW_HIDE); GetDlgItem(IDC_INPUT_OK)->ShowWindow(SW_HIDE); GetDlgItem(IDC_CLEAR_ONCE)->ShowWindow(SW_HIDE); GetDlgItem(IDC_CLEAR_ALL)->SetWindowTextW(L"返回"); GetDlgItem(IDC_STATIC_SHOW)->SetWindowTextW(L"最小生成树显示图"); RedrawWindow(); TransForm(); ReDrawAll(); } 以上两个响应函数就使得对话框内的控键隐藏或显示,达到那种动态的效果,然后再说明一下用户如何输入: 当用户选择上面的结点单选按扭时,用鼠标点击在框内的有效区就会弹出一个对话框,是要你输入此结点的内容,确定之后就会在屏幕上显示出一个圆形,圆内有你输入的字符,表示一个结点输入完成,当再输入时,如果在结点附近输入一定会出现重合,那么一定要处理何处才能绘画。 并且当用户点击边的单选按钮时,当在原来的一个圆区内点击,此时鼠标变成“十”字形,当在另一个圆释放时,就会在此两圆之间输出一条直线,并在此前弹出一个对话框要你输入边的权值,并且此权值也会出现在边的中点处,还有一些情况表示输入不当,都做了相应处理,具体见代码: voidCGraphDlg: : OnLButtonDown(UINTnFlags,CPointpoint) { //TODO: 在此添加消息处理程序代码和/或调用默认值 UpdateData(true); CClientDC*pDC=(CClientDC*)GetWindowDC(); CStringstr; //str.Format(L"%d",m_type); //AfxMessageBox(str); //str.Format(L"%d,%d",point.x,point.y); //AfxMessageBox(str); //pDC->SelectStockObject(NULL_BRUSH); if(point.x<40||point.x>520||point.y<40||point.y>410) return; if(m_type==0&&m_bDrawOrShow==true) { for(inti=0;i if((point.x-m_node[i].x)*(point.x-m_node[i].x)+ (point.y-m_node[i].y)*(point.y-m_node[i].y)<=30*30) { MessageBox(L"结点距离不能太近,此处不合适添加结点! ! ! ",L"警告"); return; } CDataDlgdlg; index: if(dlg.DoModal()==IDOK) { str=dlg.m_data; //AfxMessageBox(str); if(str.GetLength()! =1) gotoindex; charch=(char)str[0]; if(! (ch>='0'&&ch<='9')&&! (ch>='a'&&ch<='z')&&! (ch>='A'&&ch<='Z')) gotoindex; m_node[m_num++]=point; m_gnors[m_n++]=GNorS(point,CPoint(0,0),TRUE,ch,0,TRUE); //pDC->Rectangle(point.x-12,point.y+15,point.x+18,point.y+45); pDC->Ellipse(point.x-12,point.y+15,point.x+18,point.y+45); pDC->TextOutW(point.x-2,point.y+22,str); } else ; } elseif(m_type==1&&m_bDrawOrShow==true) { for(inti=0;i if((point.x-m_node[i].x)*(point.x-m_node[i].x)+ (point.y-m_node[i].y)*(point.y-m_node[i].y)<=15*15) { //AfxMessageBox(L"一条直线的点坐标确定! ! ! "); m_startPoint=m_node[i]; : : SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS)); break; } } else ; CDialog: : OnLButtonDown(nFlags,point); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// voidCGraphDlg: : OnLButtonUp(UINTnFlags,CPointpoint) { //TODO: 在此添加消息处理程序代码和/或调用默认值 if(m_type==1&&m_startPoint! =CPoint(0,0)&&m_bDrawOrShow==true) { for(inti=0;i if((point.x-m_node[i].x)*(point.x-m_node[i].x)+ (point.y-m_node[i].y)*(point.y-m_node[i].y)<=15*15 &&(point.x-m_startPoint.x)*(point.x-m_startPoint.x)+ (point.y-m_startPoint.y)*(point.y-m_startPoint.y)>=15*15) { CPowerDlgdlg; if(dlg.DoModal()==IDOK) { intpower=dlg.m_power; CStringstr; str.Format(L"%d",power); CClientDC*pDC=(CClientDC*)GetWindowDC(); pDC->MoveTo(m_startPoint.x+3,m_startPoint.y+30); pDC->LineTo(m_node[i].x+3,m_node[i].y+30); pDC->TextOutW((m_startPoint.x+m_node[i].x)/2+3,(m_startPoint.y+m_node[i].y)/2+30,str); m_gnors[m_n++]=GNorS(m_startPoint,m_node[i],FALSE,'? ',power,TRUE); } else ; break; } } m_startPoint=CPoint(0,0); CDialog: : OnLButtonUp(nFlags,point); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// voidCGraphDlg: : OnMouseMove(UINTnFlags,CPointpoint) { //TODO: 在此添加消息处理程序代码和/或调用默认值 //if(m_type==1&&m_startPoint! =CPoint(0,0)) //{ //CClientDC*pDC=(CClientDC*)GetWindowDC(); //CPenpen; //pen.CreatePen(PS_DASHDOT,1,RGB(255,0,0)); //CPen*pOldPen=pDC->SelectObject(&pen); //pDC->MoveTo(m_startPoint.x+3,m_startPoint.y+30); //pDC->LineTo(point.x+3,point.y+30); //pDC->SelectObject(pOldPen); //} if(m_type==1&&m_startPoint! =CPoint(0,0)) : : SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS)); CDialog: : OnMouseMove(nFlags,point); } 还有一些按键的响应函数,具体代码如下所示: voidCGraphDlg: : OnBnClickedExit() { //TODO: 在此添加控件通知处理程序代码 if(MessageBox(L"是否真的选择退出",L"提示",MB_OKCANCEL)==IDOK) EndDialog(IDC_EXIT); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// voidCGraphDlg: : OnBnClickedClearAll() { //TODO: 在此添加控件通知处理程序代码 if(m_bDrawOrShow==false) { m_bDrawOrShow=true; GetDlgItem(IDC_OBJECT)->ShowWindow(SW_SHOW); GetDlgItem(IDC_NODE)->ShowWindow(SW_SHOW); GetDlgItem(IDC_SIDE)->ShowWindow(SW_SHOW); GetDlgItem(IDC_INPUT_OK)->ShowWindow(SW_SHOW); GetDlgItem(IDC_CLEAR_ONCE)->ShowWindow(SW_SHOW); GetDlgItem(IDC_CLEAR_ALL)->SetWindowTextW(L"清除所有"); GetDlgItem(IDC_STATIC_SHOW)->SetWindowTextW(L"图形的绘制与显示"); for(inti=0;i if(m_gnors[i].bNorS==FALSE) m_gnors[i].bShow=TRUE; RedrawWindow(); ReDrawAll(); } else { m_num=0; m_type=0; m_n=0; RedrawWindow(); } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// voidCGraphDlg: : OnBnClickedClearOnce() { //TODO: 在此添加控件通知处理程序代码 if(m_n>0) { --m_n; m_num=0; RedrawWindow(); ReDrawAll(); } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// voidCGraphDlg: : ReDrawAll(void) { CClientDC*pDC=(CClientDC*)GetWindowDC(); for(inti=0;i { if(m_gnors[i].bShow==TRUE) { if(m_gnors[i].bNorS==TRUE) { pDC->Ellipse(m_gnors[i].p1.x-12,m_gnors[i].p1.y+15, m_gnors[i].p1.x+18,m_gnors[i].p1.y+45); pDC->TextOutW(m_gnors[i].p1.x-2,m_gnors[i].p1.y+22,(CString)m_gnors[i].data); ++m_num; } else { CStringstr; str.Format(L"%d",m_gnors[i].power); pDC->MoveTo(m_gnors[i].p1.x+3,m_gnors[i].p1.y+30); pDC->LineTo(m_gnors[i].p2.x+3,m_gnors[i].p2.y+30); pDC->TextOutW((m_gnors[i].p1.x+m_gnors[i].p2.x)/2+3, (m_gnors[i].p1.y+m_gnors[i].p2.y)/2+30,str); } } } } 还有一些其它要用到的函数,代码如下所示: voidCGraphDlg: : ReDrawAll(void) { CClientDC*pDC=(CClientDC*)GetWindowDC(); for(inti=0;i { if(m_gnors[i].bShow==TRUE) { if(m_gnors[i].bNorS==TRUE) { pDC->Ellipse(m_gnors[i].p1.x-12,m_gnors[i].p1.y+15, m_gnors[i].p1.x+18,m_gnors[i].p1.y+45); pDC->TextOutW(m_gnors[i].p1.x-2,m_gnors[i].p1.y+22,(CString)m_gnors[i].data); ++m_num; } else { CStringstr; str.Format(L"%d",m_gnors[i].power); pDC->MoveTo(m_gnors[i].p1.x+3,m_gnors[i].p1.y+30); pDC->LineTo(m_gnors[i].p2.x+3,m_gnors[i].p2.y+30); pDC->TextOutW((m_gnors[i].p1.x+m_gnors[i].p2.x)/2+3, (m_gnors[i].p1.y+m_gnors[i].p2.y)/2+30,str); } } } } voidCGraphDlg: : TransForm(void) { for(inti=0;i if(m_gnors[i].bNorS==FALSE) m_gnors[i].bShow=FALSE; CStringstr; CPoint*index; index=newCPoint[m_num]; //for(inti=0;i //{ //str.Format(L"m_gnors[%d].bNors=%d,m_gnors[%d].bShow=%d,m_gnors[%d].data=%c\ //m_gnors[%d].p1=(%d,%d),m_gnors[%d].p2=(%d,%d),m_gnors[%d].power=%d", //i,m_gnors[i].bNorS,i,m_gnors[i].bShow,i,m_gnors[i].data,i,m_gnors[i].p1.x, //m_gnors[i].p1.y,i,m_gnors[i].p2.x,m_gnors[i].p2.y,i,m_gnors[i].power); //AfxMessageBox(str); //} intminpower=1000; for(inti=0;i if(m_gnors[i].bNorS==FALSE) if(minpower>m_gnors[i].power) { minpower=m_gnors[i].power; index[0]=m_gnors[i].p1; index[1]=m_gnors[i].p2; } for(inti=0;i if(m_gnors[i].p1==index[0]&&m_gnors[i].p2==index[1]) { m_gnors[i].bShow=TRUE; /*str.Format(L"求最开始的两个结点的权=%d",m_gnors[i].power); AfxMessageBox(str);*/ } //for(inti=0;i //{ //str.Format(L"m_gnors[%d].bNors=%d,m_gnors[%d].bShow=%d,m_gnors[%d].data=%c\ //m_gnors[%d].p1=(%d,%d),m_gnors[%d].p2=(%d,%d),m_gnors[%d].power=%d", //i,m_gnors[i].bNorS,i,m_gnors[i].bShow,i,m_gnors[i].data,i,m_gnors[i].p1.x, //m_gnors[i].p1.y,i,m_gnors[i].p2.x,m_gnors[i].p2.y,i,m_gnors[i].power); //AfxMessageBox(str); //} intn=2; //for(inti=0;i //{ //str.Format(L"index[%d].x=%d,index[%d].y=%d",i,index[i].x,i,index[i].y); //AfxMessageBox(str); //} while(n { //AfxMessageBox(L"进入"); minpower=1000; intj=-1; intk=0; CPointp; for(inti=0;i { p=CPoint(0,0); k=IndexInElseSide(index,n,m_gnors[i]); /*str.Format(L"k=%d",k); AfxMessageBox(str);*/ if(k! =0) { if(minpower>m_gnors[i].power) { minpower=m_gnors[i].power; j=i; if(k==1) index[n]=m_gnors[i].p2; else index[n]=m_gnors[i].p1; } /*str.Format(L"权=%d",minpower); AfxMessageBox(str);*/ } } k=0; m_gnors[j].bShow=TRUE; //for(inti=0;i //{ //str.Format(L"m_gnors[%d].bNors=%d,m_gnors[%d].bShow=%d,m_gnors[%d].data=%c\ //m_gnors[%d].p1=(%d,%d),m_gnors[%d].p2=(%d,%d),m_gnors[%d].power=%d", //i,m_gnors[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最小 生成