📄 匈牙利法解分派问题dlg.cpp
字号:
// 匈牙利法解分派问题Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "匈牙利法解分派问题.h"
#include "匈牙利法解分派问题Dlg.h"
#include <fstream.h>
#include "fileload.h"
#include "xiezibanload.h"
#include "bytext.h"
#include "bylist.h"
#include "select.h"
#include "help.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int N;
float **a,**b,**c;
float sum=0;
int count;
LV_COLUMN lvColumn;
int *zero_num,*quan,*h,*l,*h1,*l1;
bool item=true;
char filename[50]="test.dat";
char newfilename[50];
bool show_select=true;
int select_num;
char **change_data;
bool changed=false;
bool calc=false;
int word=0;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
m_sum = 0.0f;
m_width = 100;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
DDX_Control(pDX, IDC_LIST1, m_ListCtrl);
DDX_Text(pDX, IDC_EDIT1, m_sum);
DDX_Text(pDX, IDC_EDIT2, m_width);
//}}AFX_DATA_MAP
CWnd *p;
p=GetDlgItem(IDOK3);
if(calc==false)p->EnableWindow(false);
else p->EnableWindow();
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK2, Oncalc)
ON_BN_CLICKED(IDOK3, Onshow)
ON_BN_CLICKED(IDOK4, Onfileload)
ON_BN_CLICKED(IDOK5, Onxieziban)
ON_NOTIFY(NM_CLICK, IDC_LIST1, OnClickList1)
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, OnDblclkList1)
ON_BN_CLICKED(IDHELP, OnHelp)
ON_BN_CLICKED(IDSET, OnSet)
ON_BN_CLICKED(IDWORD, OnWord)
ON_BN_CLICKED(IDWORD2, Onexcel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers
BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
lvColumn.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;
lvColumn.fmt=LVCFMT_LEFT;
lvColumn.cx=100;
ifstream sfile(filename);
sfile>>N;
for(int i=0;i<N;i++) a=new float* [N];
for(int j=0;j<N;j++) a[j]=new float [N];
for(i=0;i<N;i++) b=new float* [N];
for( j=0;j<N;j++) b[j]=new float [N];
for( i=0;i<N;i++) c=new float* [N];
for( j=0;j<N;j++) c[j]=new float [N];
for(i=0;i<N;i++){
zero_num=new int [N];
quan=new int [N];
h=new int [N];
l=new int [N];
h1=new int [N];
l1=new int [N];
}
float data;
for(i=0;i<N;i++)
for(int j=0;j<N;j++) {
sfile>>data;
c[i][j]=a[i][j]=data;
}
for(i=0;i<N+1;i++){
char title[10];
if(i==0)strcpy(title,"菜单");
else {
strcpy(title,"第");
char num[4];
itoa(i,num,10);
strcat(title,num);
strcat(title,"人");
}
lvColumn.iSubItem=i;
lvColumn.pszText=title;
m_ListCtrl.InsertColumn(i,&lvColumn);
}
m_ListCtrl.DeleteAllItems();
char strdata[35];
for(i=0;i<N;i++){
// sfile>>data;
//c[i][0]=a[i][0]=data;
char title[20];
strcpy(title,"任务");
char num[4];
itoa(i+1,num,10);strcat(title,num);
m_ListCtrl.InsertItem(i,title);
strcpy(strdata,"┋ ");
char strdata1[30];
gcvt(a[i][0],5,strdata1);strcat(strdata,strdata1);
m_ListCtrl.SetItemText(i,1,strdata);
for(int j=1;j<N;j++){
//sfile>>data;
//c[i][j]=a[i][j]=data;
strcpy(strdata,"┋ ");
char strdata1[30];
gcvt(a[i][j],5,strdata1);strcat(strdata,strdata1);
m_ListCtrl.SetItemText(i,j+1,strdata);
}
}
for(i=0;i<N+1;i++)
m_ListCtrl.SetColumnWidth(i,100);
sfile.close();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
}
void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMyDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
/*char strdata[35];
for(int i=0;i<N;i++){
gcvt(a[i][0],5,strdata);
char title[20];
strcpy(title,"task");
char num[4];
itoa(i+1,num,10);strcat(title,num);
int k=m_ListCtrl.InsertItem(i,title);
m_ListCtrl.SetItemText(k,1,strdata);
for(int j=1;j<N;j++){
gcvt(a[i][j],4,strdata);
m_ListCtrl.SetItemText(k,j,strdata);
}
}
for(i=0;i<N;i++)
m_ListCtrl.SetColumnWidth(i,100);*/
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMyDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMyDlg::get_quan(float **b){
bool loop=true;
for(int i=0;i<N;i++) if(zero_num[i]>0)break;
if(i==N) loop=false;
if(loop==true){
int min_num=zero_num[0];
int place=0;
for(i=0;i<N;i++)
if((min_num>zero_num[i]&&zero_num[i]>0)||min_num<=0){
min_num=zero_num[i];
place=i;
}
for(int j=0;j<N;j++)
if(b[place][j]==0) break;
quan[place]=j;
zero_num[place]=0;
for(i=0;i<N;i++){
b[place][i]=1;
if(b[i][j]==0) zero_num[i]--;
b[i][j]=1;
}
get_quan(b);
}
}//此函数的作用是得到数组b的画圈的位置,若某行无圈则quan[i]为-1。
void CMyDlg::Oncalc()
{calc=true;
sum=0;
// TODO: Add your control notification handler code here
for(int i=0;i<N;i++) {
quan[i]=-1;
zero_num[i]=0;
h[i]=0;l[i]=0;
for(int j=0;j<N;j++) b[i][j]=1;
}
item=false;
for( i=0;i<N;i++)
{
float min=a[i][0];
for(int j=0;j<N;j++)
if(a[i][j]<min) min=a[i][j];
for(j=0;j<N;j++) a[i][j]-=min;
}
for(i=0;i<N;i++)
{
float min=a[0][i];
for(int j=0;j<N;j++)
if(a[j][i]<min) min=a[j][i];
for(j=0;j<N;j++)
a[j][i]-=min;
}//得到C1
lab: for(i=0;i<N;i++){
zero_num[i]=0;
for(int j=0;j<N;j++)
{
if(a[i][j]==0) b[i][j]=0;
if(a[i][j]==0) zero_num[i]+=1;
}
}//得到每一行0的个数zero_num[i]。
get_quan(b);//调用该函数为C1画圈。
for(i=0;i<N;i++){
for(int j=0;j<N;j++)
{
if(a[i][j]==0) b[i][j]=0;
}
}
for(i=0;i<N;i++)
if(quan[i]==-1){
h[i]=1;
for(int j=0;j<N;j++)
if(a[i][j]==0){
l[j]=1;
for(int k=0;k<N;k++)
if(quan[k]==j) h[k]=1;
}
}//初次为行于列进行标记。
while(1){
for(int i=0;i<N;i++){
h1[i]=h[i];l1[i]=l[i];
}
for(i=0;i<N;i++)
if(h[i]==1){
for(int j=0;j<N;j++)
if(a[i][j]==0) {
l[j]=1;
for(int k=0;k<N;k++)
if(quan[k]==j) h[k]=1;
}
}
for(i=0;i<N;i++)
if(h1[i]!=h[i]||l1[i]!=l[i]) break;
if(i==N) break;
}//循环直到没有新的行与列被标记。
float mindata;
bool first=true;
for(i=0;i<N;i++)
for(int j=0;j<N;j++)
if(h[i]==1&&l[j]==0){
if(first==true) {
mindata=a[i][j];
first=false;
}
else {
if(mindata>a[i][j]) mindata=a[i][j];
}
}
for(i=0;i<N;i++)
for(int j=0;j<N;j++)
{
if(h[i]==1) a[i][j]-=mindata;
if(l[j]==1) a[i][j]+=mindata;
}//计算得到数组C2.
for(i=0;i<N;i++) if(quan[i]==-1)break;//判断是否已经符合要求,如若不然则回归继续运算。
if(i<N) {//回归继续运算前的初始化。
count++;
cout<<count<<endl;
for(int j=0;j<N;j++)
quan[j]=-1;
for(j=0;j<N;j++)
h[j]=0;
for(j=0;j<N;j++)
l[j]=0;
goto lab;//回归。
}
for(i=0;i<N;i++){
sum+=c[i][quan[i]];
}
// cout<<endl<<sum<<endl;
m_sum=sum;
for(i=0;i<N;i++)
for(int j=0;j<N;j++)
a[i][j]=c[i][j];
//m_ListCtrl.;
UpdateData(false);
}
void CMyDlg::Onshow()
{
CWnd *p;
p=GetDlgItem(IDOK3);
//p->EnableWindow();
if(calc==true)
//AfxMessageBox("请先计算后再查看选择情况!",MB_ICONINFORMATION);
{
UpdateData();
if(show_select==true){
p->SetWindowText("显示数据(&S)");
// TODO: Add your control notification handler code here
m_ListCtrl.DeleteAllItems();
for(int i=0;i<N;i++) {
char title[20];
strcpy(title,"任务");
char num[20];
itoa(i+1,num,10);
strcat(title,num);
m_ListCtrl.InsertItem(i,title);
//if(quan[i]==0) m_ListCtrl.InsertItem(i+1,"****");
//else {
//m_ListCtrl.InsertItem(i+1," ");
char num1[4];
strcpy(num,title);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -