Dynamic Programming

来源:互联网 发布:驱动加密软件 编辑:程序博客网 时间:2024/05/22 11:46
// 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 solutionfor (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 inputlinex = "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;}

0 0
原创粉丝点击