UVa Problem
Solution:
Solution:
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cmath>
#include <limits>
using namespace std;
struct Point
{
int x, y;
};
struct Link
{
Point start, end;
double distance;
};
class NetworkSolver
{
public:
NetworkSolver(const vector<Point>& nodes) :
mNodes(nodes), mTotalLength(numeric_limits<int>::max()),
mConfig(nodes.size() - 1)
{
}
double getTotalLength()
{
return mTotalLength;
}
vector<Link> getConfig()
{
return mConfig;
}
void solve()
{
vector<Point> buffer(mNodes.size());
vector<bool> bFree(mNodes.size(), true);
doSolve(buffer, bFree, 0);
}
private:
void doSolve(vector<Point>& buffer, vector<bool>& bFree, int level)
{
if(level == mNodes.size())
{
double currDist = 0;
for(int iNode = 0; iNode < level - 1; ++iNode)
{
currDist += (16 + sqrt( (buffer[iNode].x - buffer[iNode+1].x)
* (buffer[iNode].x - buffer[iNode+1].x)+
(buffer[iNode].y - buffer[iNode+1].y)
* (buffer[iNode].y - buffer[iNode+1].y)));
}
if(currDist < mTotalLength)
{
mTotalLength = currDist;
for(int iNode = 0; iNode < buffer.size() - 1; ++iNode)
{
mConfig[iNode].start = buffer[iNode];
mConfig[iNode].end = buffer[iNode+1];
// Euclidean Distance
mConfig[iNode].distance =
(16 + sqrt( (buffer[iNode].x - buffer[iNode+1].x)
* (buffer[iNode].x - buffer[iNode+1].x)+
(buffer[iNode].y - buffer[iNode+1].y)
* (buffer[iNode].y - buffer[iNode+1].y)));
}
}
return;
}
for(int i = 0; i < mNodes.size(); ++i)
{
if(bFree[i])
{
bFree[i] = false;
int tmp = buffer.size();
buffer[level] = mNodes[i];
tmp = buffer.size();
doSolve(buffer, bFree, level+1);
bFree[i] = true;
}
}
}
private:
const vector<Point>& mNodes;
vector<Link> mConfig;
double mTotalLength;
};
int main(int argc, char *argv[])
{
int iNetwork = 1;
int numComputers;
while( (cin >> numComputers) && numComputers)
{
vector<Point> nodes;
for(int iNode = 0; iNode < numComputers; ++iNode)
{
Point currNode;
cin >> currNode.x;
cin >> currNode.y;
nodes.push_back(currNode);
}
// Node and Distance of result configuration
vector<Link> links;
double totalLength;
NetworkSolver solver(nodes);
solver.solve();
links = solver.getConfig();
totalLength = solver.getTotalLength();
printf("**********************************************************\n");
printf("Network #%d\n", iNetwork);
for(int iLink = 0; iLink < links.size(); ++iLink)
{
printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2f feet.\n",
links[iLink].start.x,
links[iLink].start.y,
links[iLink].end.x,
links[iLink].end.y,
links[iLink].distance);
}
printf("Number of feet of cable required is %.2f.\n", totalLength);
++iNetwork;
}
return 0;
}
No comments:
Post a Comment