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

📄 maxstreamview.cpp

📁 学习VC的时候写的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  ArrowMid.x=(int)(c_pEnd.x-10*m_fCos+0.5);
  ArrowMid.y=(int)(c_pEnd.y+10*m_fSin+0.5);
  ArrowFirst.x=(int)(ArrowMid.x-2*m_fSin+0.5);
  ArrowFirst.y=(int)(ArrowMid.y-2*m_fCos+0.5);
  ArrowSecond.x=(int)(ArrowMid.x+2*m_fSin+0.5);
  ArrowSecond.y=(int)(ArrowMid.y+2*m_fCos+0.5);
  }
  if(c_pEnd.x<c_pStart.x&&c_pEnd.y<=c_pStart.y)
  {
  ArrowMid.x=(int)(c_pEnd.x+10*m_fCos+0.5);
  ArrowMid.y=(int)(c_pEnd.y+10*m_fSin+0.5);
  ArrowFirst.x=(int)(ArrowMid.x+2*m_fSin+0.5);
  ArrowFirst.y=(int)(ArrowMid.y-2*m_fCos+0.5);
  ArrowSecond.x=(int)(ArrowMid.x-2*m_fSin+0.5);
  ArrowSecond.y=(int)(ArrowMid.y+2*m_fCos+0.5);
  }
  if(c_pEnd.x<c_pStart.x&&c_pEnd.y>=c_pStart.y)
  {
  ArrowMid.x=(int)(c_pEnd.x+10*m_fCos+0.5);
  ArrowMid.y=(int)(c_pEnd.y-10*m_fSin+0.5);
  ArrowFirst.x=(int)(ArrowMid.x-2*m_fSin+0.5);
  ArrowFirst.y=(int)(ArrowMid.y-2*m_fCos+0.5);
  ArrowSecond.x=(int)(ArrowMid.x+2*m_fSin+0.5);
  ArrowSecond.y=(int)(ArrowMid.y+2*m_fCos+0.5);
  }
///////////////////////////////////////////////////////////////////
  CBrush *pBrhOld;
  pBrhOld=(CBrush *)dc.SelectStockObject(BLACK_BRUSH);
  POINT polygpt[3]={{ArrowFirst.x,ArrowFirst.y},{ArrowSecond.x,ArrowSecond.y},{c_pEnd.x,c_pEnd.y}};
  dc.Polygon(polygpt,3);
  dc.SelectObject(pBrhOld);
}

void CMaxStreamView::Label(CPoint c_pStart,CPoint c_pEnd,CString TempText1,CString TempText2)
{
  CClientDC dc(this);
  float m_nSlope;
  m_nSlope=(float)(c_pStart.y-c_pEnd.y)/(c_pStart.x-c_pEnd.x);
  if(m_nSlope<=0&&m_nSlope>=-1)
  {
  dc.TextOut((c_pStart.x+c_pEnd.x)/2-10,(c_pStart.y+c_pEnd.y)/2-15,TempText1);
  dc.TextOut((c_pStart.x+c_pEnd.x)/2-10,(c_pStart.y+c_pEnd.y)/2+10,TempText2); 
  }
  else if(m_nSlope<=1&&m_nSlope>0)
  {
  dc.TextOut((c_pStart.x+c_pEnd.x)/2+10,(c_pStart.y+c_pEnd.y)/2-10,TempText1);
  dc.TextOut((c_pStart.x+c_pEnd.x)/2+10,(c_pStart.y+c_pEnd.y)/2+15,TempText2);
  }
  else if(m_nSlope<-1)
  {
  dc.TextOut((c_pStart.x+c_pEnd.x)/2-10,(c_pStart.y+c_pEnd.y)/2-10,TempText1);
  dc.TextOut((c_pStart.x+c_pEnd.x)/2+15,(c_pStart.y+c_pEnd.y)/2-10,TempText2);
  }
  else
  {
  dc.TextOut((c_pStart.x+c_pEnd.x)/2+15,(c_pStart.y+c_pEnd.y)/2+10,TempText1);
  dc.TextOut((c_pStart.x+c_pEnd.x)/2-10,(c_pStart.y+c_pEnd.y)/2+10,TempText2);
  }
}

void CMaxStreamView::OnCompute() 
{
	// TODO: Add your command handler code here
	CClientDC dc(this);
	OperationChoice=3;
	// The core code
    int TempMin=99999;
	int i,j;
	int TheEnd=PointNumber-1;
	int TempDoing[25][25];
	int PathI[25],m_mkk=0;
	int PathJ[25];
	int TempMM[25];
	//int RouteFull[25][25];
	//int TraceLabel[25][25];
	for(i=0;i<25;i++)
	{
	  for(j=0;j<25;j++)
	  {
       TempDoing[i][j]=0;
	   //RouteFull[i][j]=0;
	  }
	}
    for(i=0,j=1;j<=TheEnd;j++)
	  {
		if(m_nMax[i][TheEnd]!=0&&m_nMax[i][TheEnd]!=m_nActual[i][TheEnd])
			j=TheEnd;
		if(TempDoing[i][j]!=0||TempDoing[j][i]!=0)
			continue;
		if(m_nMax[i][j]==0&&m_nMax[j][i]==0&&j!=TheEnd)
			continue;
		if(m_nMax[i][j]!=0&&m_nMax[i][j]==m_nActual[i][j]&&j!=TheEnd)
        	 continue;
		if(m_nMax[j][i]!=0&&m_nActual[j][i]==0&&j!=TheEnd)
			 continue;
		if(m_nMax[i][j]<m_nActual[i][j]||m_nMax[j][i]<m_nActual[j][i])
		{
		  MessageBox("网络中存在超载!","警告",MB_ICONWARNING|MB_OK);
		  exit(0);
		}
        if(m_nMax[i][j]>m_nActual[i][j])
		{
			TempMin=(TempMin<(m_nMax[i][j]-m_nActual[i][j]))?TempMin:(m_nMax[i][j]-m_nActual[i][j]);
			PathI[m_mkk]=i;
			TempMM[m_mkk]=TempMin;
			PathJ[m_mkk++]=j;
			TempDoing[i][j]=1;
		}
	    if(m_nActual[j][i]!=0)
		{
			TempMin=(TempMin<m_nActual[j][i])?TempMin:m_nActual[j][i];
            PathI[m_mkk]=i;
			TempMM[m_mkk]=TempMin;
			PathJ[m_mkk++]=j;
			TempDoing[i][j]=2;
		}
		if(j==TheEnd&&m_nMax[i][j]>m_nActual[i][j])
		{ 
	      for(i=0;i<25;i++)
			  for(j=0;j<25;j++)
			  {
			    if(TempDoing[i][j]==1)
				    m_nActual[i][j]=m_nActual[i][j]+TempMin;
				if(TempDoing[i][j]==2)
				    m_nActual[j][i]=m_nActual[j][i]-TempMin;
				TempDoing[i][j]=0;
			  }
          i=0;j=0;TempMin=99999;m_mkk=0;
		/*  CString chh;
			  chh.Format("ssee:%d,%d",i,j);
			  MessageBox(chh,"sfs",MB_OK);*/  //调试用
		  continue;
		}
		if(j==TheEnd&&m_nMax[i][j]==m_nActual[i][j])
		{
		 if(m_mkk==0)
		    break;
      	 i=PathI[--m_mkk];
		 j=PathJ[m_mkk];
		 TempMin=TempMM[m_mkk];
		 TempDoing[i][j]=0;
		 continue;   //回朔
		}
		i=j;j=0;
	 }
		for(j=0;j<25;j++)
			  m_nTheMaxStream=m_nTheMaxStream+m_nActual[0][j];
	////////////////////////////////////////////
	CString TextOutput;
	TextOutput.Format("最大流是:%d",m_nTheMaxStream);
	dc.TextOut(10,10,TextOutput);
	/////////////////////////////////////////////////
	int nn=0;
	int BackI[25],BackJ[25],BackNN=0;
	for(i=0,j=1;j<=TheEnd;j++)
	{ 
	  if(m_nMax[i][j]!=0&&m_nMax[i][j]==m_nActual[i][j])
		  m_nMin[i][j]=1;
	  if(m_nMax[i][j]!=0&&m_nMax[i][j]!=m_nActual[i][j])
	  {
		  BackI[BackNN]=i;
		  BackJ[BackNN++]=j;
		  i=j;
		  continue;
	  }
	  if(j==TheEnd&&i!=0)
	  {
	      i=BackI[--BackNN];
		  j=BackJ[BackNN];
	  }
	  if(j==TheEnd&&i==0)
		  break;
	}


	for(i=0;i<25;i++)
		for(j=0;j<25;j++)
		{
		  if(m_nMin[i][j]==1)
		  {    
           NN++; 
		   c_pMidMin[nn].x=(m_ptResource[i].x+m_ptResource[j].x)/2;
		   c_pMidMin[nn++].y=(m_ptResource[i].y+m_ptResource[j].y)/2;
		  }
		}	
    CPen PenNew;
	PenNew.CreatePen(PS_DASH,1,RGB(0,0,255));
	CPen *pPenOld;
	pPenOld=dc.SelectObject(&PenNew);
	CPoint Temptt;
	for(nn=1;nn<NN;nn++)
	{
	  if(c_pMidMin[nn-1].x>c_pMidMin[nn].x)
	  {
          Temptt=c_pMidMin[nn-1];
		  c_pMidMin[nn-1]=c_pMidMin[nn];
		  c_pMidMin[nn]=Temptt;
	  }
	}
    for(nn=1;nn<NN;nn++)
	 {
		dc.MoveTo(c_pMidMin[nn-1]);
		dc.LineTo(c_pMidMin[nn]);
	 }
	dc.SelectObject(pPenOld);
	PenNew.DeleteObject();
	Invalidate();
}

void CMaxStreamView::OnSetZero() 
{
	// TODO: Add your command handler code here
	m_nTheMaxStream=0;
	OperationChoice=0;
	PointNumber=0;
	NN=0;
	m_ptResource[0]='\0';
	int i,j;
	for(i=0;i<25;i++)
	  for(j=0;j<25;j++)
	  {
	    m_nMax[i][j]=0;
		m_nActual[i][j]=0;
		m_nMin[i][j]=0;
	  }
    Invalidate();
}

void CMaxStreamView::OnInputhelp() 
{
	// TODO: Add your command handler code here
	dlgHelp=new DlgViewHelp;
	dlgHelp->Create(IDD_DLGHELP,NULL);
	dlgHelp->ShowWindow(SW_SHOW);
}

void CMaxStreamView::OnFileSave() 
{
/*	int OperationChoice;
   CPoint m_ptResource[25];
   int PointNumber;
   int m_nMax[25][25],m_nActual[25][25];
   int m_nMin[25][25],m_nTheMaxStream;
   CPoint c_pMidMin[25];
   int NN;*/
    CFileDialog MyFileDlg(FALSE,_T("wgs"),_T("*.wgs"),0,"专用文件(*.wgs)|*.wgs||",this);
	if(MyFileDlg.DoModal()==IDOK)
	{
	   CString strFileName=MyFileDlg.GetPathName();
	   char *FileName;
	   int i,Length;
	   Length=strFileName.GetLength();
       FileName=new char[Length];
	   for(i=0;i<Length;i++)
		   *(FileName+i)=strFileName.GetAt(i);
	   *(FileName+i)='\0';
	   FILE *MyFile;
	   if((MyFile=fopen(FileName,"wb"))==NULL)
	   {
		   MessageBox("无法保存文件!");
		   exit(0);
	   }
	   fwrite(&OperationChoice,2,1,MyFile);
	   fwrite(&PointNumber,2,1,MyFile);
	   fwrite(&NN,2,1,MyFile);
	   fwrite(m_nMax,2,25*25,MyFile);
	   fwrite(m_nActual,2,25*25,MyFile);
	   fwrite(m_nMin,2,25*25,MyFile);
	   fwrite(&m_nTheMaxStream,2,1,MyFile);
	   fwrite(m_ptResource,sizeof(CPoint),25,MyFile);
	   fwrite(c_pMidMin,sizeof(CPoint),25,MyFile);
       fclose(MyFile); 
	}
	else
		MessageBox("无法保存文件!");
}

void CMaxStreamView::OnFileOpen() 
{
	// TODO: Add your command handler code here
	/*	int OperationChoice;
   CPoint m_ptResource[25];
   int PointNumber;
   int m_nMax[25][25],m_nActual[25][25];
   int m_nMin[25][25],m_nTheMaxStream;
   CPoint c_pMidMin[25];
   int NN;*/
   CFileDialog MyFileDlg(TRUE,NULL,NULL,0,"专用文件(*.wgs)|*.wgs||",this);
   if(MyFileDlg.DoModal()==IDOK)
   {
     CString strFileName=MyFileDlg.GetPathName();
	 char *FileName;
	 int i,Length;
	 Length=strFileName.GetLength();
     FileName=new char[Length];
	 for(i=0;i<Length;i++)
		 *(FileName+i)=strFileName.GetAt(i);
	 *(FileName+i)='\0';
	 FILE *MyFile;
	 if((MyFile=fopen(FileName,"rb"))==NULL)
	   {
		   MessageBox("无法打开文件!");
		   exit(0);
	   }
	 fread(&OperationChoice,2,1,MyFile);
	 fread(&PointNumber,2,1,MyFile);
	 fread(&NN,2,1,MyFile);
	 fread(m_nMax,2,25*25,MyFile);
	 fread(m_nActual,2,25*25,MyFile);
	 fread(m_nMin,2,25*25,MyFile);
	 fread(&m_nTheMaxStream,2,1,MyFile);
	 fread(m_ptResource,sizeof(CPoint),25,MyFile);
	 fread(c_pMidMin,sizeof(CPoint),25,MyFile);
	 fclose(MyFile);
   }
   else
		MessageBox("无法打开文件!");
   Invalidate();
}

⌨️ 快捷键说明

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