当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

回溯法求解 运动员最佳配对问题

    运动员最佳配问题,羽毛球队有男女运动员各N人给定两个N *N矩阵P和Q. P[I][J]是男运动员I和女运动员J配对组成混合双打的竞赛优势;Q[I][J]是女运动员I 和男运动员J配合的竞赛优势。由于配合和心理状态等各种因素影响,P[I][J]不一定等于Q[J][I].设计一个算法计算男女运动员最佳配对法,使各组男女双方竞赛优势乘积的总和达到最大。

 #include "stdafx.h"

#include <iostream>

#include <fstream>

#include <iomanip>

#include <vector>

using namespace std;

 

vector<int> Re; //全局变量,Re用来记录配对情况

vector<vector<int>> P;

vector<vector<int>> Q;

 

class Queen

{

friend int PairUp(int);

private:

bool Place(int k);

void Backtrack(int k);

int n;

int sum;

vector<int> x;

public:

Queen(int m,int c,int b)

{

x.resize(m+1);

Re.resize(m+1);

n = c;

sum = b;

}

~Queen() { }

};

 

bool Queen::Place(int k)

{

 

for(int j=1;j<k;j++)

if(x[j]==x[k]) //不同男运动员和同一个女运动员配对

return false;

return true;

}

 

void Queen::Backtrack(int t)

{

if(t>n)

{

int temp=0; //第次还原为进行下次的累加

for(int i=1;i<=n;i++)

{

temp += (P[i][x[i]]) * (Q[x[i]][i]); //累加,得到一个可行解

}

if(sum<=temp) //记录最大可行解

{

sum=temp;

copy(x.begin(),x.end(),Re.begin());

}

}

 

else

for(int i=t;i<=n;i++)

{

swap(x[t],x[i]);

if(Place(t))

Backtrack(t+1);

swap(x[t],x[i]);

}

 

}

 

int PairUp(int n)

{

Queen X(n,n,0);

 

vector<int> p;

for(int i=0;i<=n;i++)

p.push_back(i);

 

copy(p.begin(),p.end(),X.x.begin());

X.Backtrack(1);

return X.sum;

}

 

int _tmain(int argc,_TCHAR* argv[])

{

ifstream fin("input.txt");

ofstream fout("output.txt");

int n,i,j,temp;

vector<int> r;

vector<int> t;

 

fin>>n;

r.push_back(0);

P.push_back(r);

t.push_back(0);

Q.push_back(t);

cout<<"从文件input.txt中获得数据...."<<endl;

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{

fin>>temp;

r.push_back(temp);

}

P.push_back(r);

for(vector<int>::iterator vr = r.begin()+1;vr != r.end();)

{

vr = r.erase(vr);

}

}

 

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{

fin>>temp;

t.push_back(temp);

}

Q.push_back(t);

for(vector<int>::iterator vt = t.begin()+1;vt != t.end();)

{

vt = t.erase(vt);

}

}

 

cout<<"结果为:"<<PairUp(n)<<",并已保存至output.txt..."<<endl<<endl;

cout<<"男运动员"<<" & "<<"女运动员"<<endl;

for(i=1;i<=n;i++)

{

cout<<setw(4)<<i<<setw(12)<<Re[i]<<endl;

}

fout<<PairUp(n)<<endl;

return 0;

}

相关内容
赞助商链接