// ConsoleApplication43.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "iostream"
#include "string"
#include "sstream"
#include "cmath"
using namespace std;
struct islands
{
int x;
int y;
};
class route
{
public:
int numi;
float E;
route();
route(int n, float e);
islands *isd;
bool *con;
int **distmatrix;
long sum;
void addislands(int coor, int num, char c);
void printoutislands();
void printoutdistmatrix();
void compdistmat();
void connected();
void getsum();
bool allcon();
void solution();
~route()
{
delete[] isd;
delete[] con;
for (int i = 0; i < numi; i++)
delete[] distmatrix[i];
delete[] distmatrix;
}
islands start;
};
void route::addislands(int coor, int num, char c)
{
if (c == 'x')
{
isd[num].x = coor;
}
else
{
isd[num].y = coor;
con[num] = 0;
}
};
route::route(int n,float e)
{
this->numi = n;
this->E = e;
isd = new islands[n];
con = new bool[n];
}
void route::printoutislands()
{
for (int i = 0; i < numi; i++)
{
cout << isd[i].x << " ~ " << isd[i].y << endl;
}
}
void route::printoutdistmatrix()
{
for (int i = 0; i < numi; i++)
{
for (int j = 0; j < numi; j++)
{
cout << distmatrix[i][j] << " ";
}
cout << endl;
}
}
void route::compdistmat()
{
distmatrix = new int*[numi];
for (int i = 0; i < numi; i++)
{
distmatrix[i] = new int[numi];
for (int j = 0; j < numi; j++)
{
distmatrix[i][j] = sqrt(pow((isd[i].x - isd[j].x), 2) + pow((isd[i].y-isd[j].y), 2));
}
}
}
void route::connected()
{
con[0] = 1;
for (int i = 1; i < numi; i++)
{
con[i] = false;
}
bool change = 0;
do{
change = 0;
for (int i = 0; i < numi; i++)
{
for (int j = 0; j < numi; j++)
{
// cout << i << j << con[i] <<con[j] << endl;
if ((i != j) && (con[i] == 1) && (distmatrix[i][j] != INT_MAX))
{
if (con[j] == 0)
{
change = 1;
// cout << "changed" << endl;
}
con[j] = true;
}
// cout << i << j <<con[i]<< con[j] << endl;
}
// cout << con[0] << con[1] << con[2] << con[3] << endl;
// cout << "----" << endl;
}
} while (change);
}
bool route::allcon()
{
connected();
bool flag = 1;
for (int i = 0; i < numi; i++)
{
if (con[i] == 0)
flag = 0;
}
return flag;
}
void route::getsum()
{
sum=0;
for (int i = 0; i < numi; i++)
{
for (int j = i; j < numi; j++)
{
if ((i != j)&& (distmatrix[i][j] != INT_MAX))
sum=sum+distmatrix[i][j];
}
}
sum = sum*E;
}
void route::solution()
{
//get first solution
for (int i = 0; i < numi; i++)
{
for (int j = i + 1; j < numi; j++)
{
if (j < numi)
{
int tmp = distmatrix[i][j];
distmatrix[i][j] = INT_MAX;
distmatrix[j][i] = INT_MAX;
if (!allcon())
{
distmatrix[i][j] = tmp;
distmatrix[j][i] = tmp;
}
}
printoutdistmatrix();
cout << "----" << endl;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int numi;
float E;
// cin >> numi;
// cin.ignore();
numi = 4;
string linex;
string liney;
string tmp;
//cin >> linex;
//cin.ignore();
//cin >> liney;
//cin.ignore();
//sample input
linex = "0 0 400 400";
liney = "0 100 0 100";
// cin >> E;
// cin.ignore();
E = 1.0;
route myroute(numi,E);
istringstream strx(linex);
int counter = 0;
while (getline(strx, tmp, ' '))
{
int x = atoi(tmp.c_str());
// cout << x << endl;
myroute.addislands(x,counter,'x');
counter++;
}
counter = 0;
istringstream stry(liney);
while (getline(stry, tmp, ' '))
{
int y = atoi(tmp.c_str());
// cout << y << endl;
myroute.addislands(y, counter, 'y');
counter++;
}
myroute.compdistmat();
myroute.printoutislands();
myroute.printoutdistmatrix();
myroute.solution();
myroute.getsum();
cout << myroute.sum<<endl;
system("pause");
return 0;
}
Dynamic Programming
最新推荐文章于 2024-06-10 16:30:00 发布