📄 maxstreamview.cpp
字号:
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 + -