| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:哪里说了要保留两位小数?In Reply To:哪里说了要保留两位小数? Posted by:zoujing1978 at 2016-10-13 22:31:45 > 这道题我已经看出是个求最短路径的Dijkstra算法的题目,网上一搜,果然是用这个算法,然后我就放心按照这个思路去做,Sample通过了,但是提交WA了好几次,郁闷之下,再看网上别人AC的代码,发现程序框架和算法都是一样的,只是最后输出的时候别人保留了两位小数,而我没有直接输出的。后来我也该为输出保留2位小数,就AC了。但是再一看题目,不知道题目哪里说了要保留两位小数啊,好像没说啊!我英语都忘光了,谁能告诉我题目哪里说了要保留两位小数?
#include <fstream>
#include <cstdio>
#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
using namespace std;
//const int DBL_MAX = 100000000.0;
struct Point
{
double x;
double y;
double Dist(const Point& p) const;
};
double Point::Dist(const Point& p) const
{
return sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
}
class Graph
{
protected:
double **arcs; //邻接矩阵,arcs[i][j]为顶点i到顶点j的距离,非负
int vexnum; // 图的当前顶点数
int arcnum; //图的边数
double **D; //D[i][j]表示求出来的从顶点i到顶点j的最短路径
void Dijkstra(int v0); //求从v0到其余各顶点的最短路径
public:
Graph(int vexnum, double map[][205]); //构造函数
~Graph(); //析构函数
double GetDist(int start, int end);
};
Graph::Graph(int vexnum, double map[][205])
{
this->vexnum = vexnum;
this->arcs = new double*[vexnum];
this->D = new double*[vexnum];
for (int i = 0; i < vexnum; i++)
{
(this->arcs)[i] = new double[vexnum];
memcpy((this->arcs)[i], map[i], sizeof(double) * vexnum);
(this->D)[i] = new double[vexnum];
}
}
Graph::~Graph()
{
for (int i = 0; i < vexnum; i++)
{
delete[] arcs[i];
delete[] D[i];
}
delete[] arcs;
delete[] D;
}
void Graph::Dijkstra(int v0)
{
bool* final = new bool[vexnum]; //final[i]表示从顶点v0到顶点i的最短距离是否已经求出
for (int v = 0; v < vexnum; ++v)
{
final[v] = false;
D[v0][v] = arcs[v0][v];
}
D[v0][v0] = 0;
final[v0] = true;
for (int i = 0; i < vexnum; ++i) //循环vexnum次
{
//在尚未求出最短路径的顶点集合中找到距离v0最近的点v
double min = DBL_MAX;
int v = v0; // DBL_MAX为机器中表示无穷大的整数
for (int w = 0; w < vexnum; ++w)
{
if (!final[w] && D[v0][w] < min)
{
v = w;
min = D[v0][w];
}
}
final[v] = true;
for (int w = 0; w < vexnum; ++w) //更新当前最短路径和距离
{
if (!final[w] && min + arcs[v][w] < D[v0][w])
{
D[v0][w] = min + arcs[v][w];
}
}
}
delete[] final;
}
double Graph::GetDist(int start, int end)
{
Dijkstra(start);
return D[start][end];
}
int main()
{
//ifstream cin("Text.txt");
const int MAXVEXNUM = 205;
double map[MAXVEXNUM][MAXVEXNUM];
for (int i = 0; i < MAXVEXNUM; i++)
{
for (int j = 0; j < MAXVEXNUM; j++)
{
if (i == j)
{
map[i][j] = 0;
}
else
{
map[i][j] = DBL_MAX;
}
}
}
Point p[205];
Point start, end;
int v0 = 0, v1 = 1;
while (cin >> p[0].x >> p[0].y >> p[1].x >> p[1].y)
{
int n = 2;
bool flag = false;
while (cin >> p[n].x >> p[n].y)
{
if (p[n].x == -1 && p[n].y == -1)
{
flag = false;
continue;
}
if (flag)
{
double time = p[n].Dist(p[n - 1]) / 40000.0; //存储的是时间,地铁速度是40km/h
map[n][n - 1] = map[n - 1][n] = time;
}
n++;
if (!flag)
{
flag = true;
}
}
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
if (map[i][j] == DBL_MAX)
{
map[i][j] = map[j][i] = p[i].Dist(p[j]) / 10000.0; //步行的速度是10km/h
double tmp = map[i][j];
int tt = 0;
}
}
}
Graph g(n, map);
cout << setprecision(2) << g.GetDist(0, 1) * 60 << "\n";
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator