Ranking (as of 2014-06-16): 211 out of 302
Language: C++
/*
UVa 10525 - New to Bangladesh?
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_10525_New_to_Bangladesh.cpp
*/
#include <iostream>
#include <vector>
#include <utility>
#include <limits>
using namespace std;
struct edge {
int u_; // source vertex
int v_; // destination vertex
int t_; // time
int l_; // length
edge() : u_(-1), v_(-1), t_(-1), l_(-1) {}
edge(int u, int v, int t, int l) : u_(u), v_(v), t_(t), l_(l) {}
};
pair<int, int> bellman_ford(int n, int s, int t, const vector<edge>& edges)
{
// apply the Bellman-Ford's shortest path algorithm
// initialize the graph
vector< pair<int, int> > distances(n,
make_pair(numeric_limits<int>::max(), numeric_limits<int>::max()));
distances[s].first = distances[s].second = 0;
// relax the edges repeatedly
for (int i = 0; i < n - 1; i++)
for (size_t j = 0, je = edges.size(); j < je; j++) {
const edge& e = edges[j];
long long lt = static_cast<long long>(distances[e.u_].first),
ll = static_cast<long long>(distances[e.u_].second);
if (lt + e.t_ < distances[e.v_].first ||
lt + e.t_ == distances[e.v_].first && ll + e.l_ < distances[e.v_].second)
distances[e.v_] =
make_pair(distances[e.u_].first + e.t_, distances[e.u_].second + e.l_);
}
return distances[t];
}
int main()
{
int t;
cin >> t;
while (t--) {
int n, m;
cin >> n >> m;
vector<edge> edges(m * 2);
for (int i = 0; i < m; i++) {
int a, b, c, d;
cin >> a >> b >> c >> d;
a--; b--;
edges[i * 2].u_ = edges[i * 2 + 1].v_ = a;
edges[i * 2].v_ = edges[i * 2 + 1].u_ = b;
edges[i * 2].t_ = edges[i * 2 + 1].t_ = c;
edges[i * 2].l_ = edges[i * 2 + 1].l_ = d;
}
int q;
cin >> q;
while (q--) {
int s, t;
cin >> s >> t;
pair<int, int> d = bellman_ford(n, s - 1, t - 1, edges);
if (d.first != numeric_limits<int>::max())
cout << "Distance and time to reach destination is " << d.second <<
" & " << d.first << ".\n";
else
cout << "No Path.\n";
}
if (t)
cout << endl;
}
return 0;
}
No comments:
Post a Comment