Ranking (as of 2013-06-15): 211 out of 742
Language: C++
/*
UVa 10308 - Roads in the North
To build using Visual Studio 2008:
cl -EHsc -O2 roads_in_the_north.cpp
*/
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
const int nr_villages_max = 10000;
vector< vector< pair<int, int> > > roads(nr_villages_max + 1);
// roads[i].first is the number of village adjacent to the village i
// roads[i].second is the length of road between the village i and
// roads[i].first
int dfs(int v, int pv, int& diameter)
{
int max_d = 0, second_max_d = 0;
for (vector< pair<int, int> >::const_iterator i = roads[v].begin(),
e = roads[v].end(); i != e; ++i) {
if (i->first == pv)
continue;
int d = i->second + dfs(i->first, v, diameter);
if (d > max_d) {
second_max_d = max_d; max_d = d;
}
else if (d > second_max_d)
second_max_d = d;
}
diameter = max(diameter, max_d + second_max_d);
return max_d;
}
int main()
{
int nr_villages = 0;
string line;
do {
getline(cin, line);
if (!cin.eof() && !line.empty()) {
istringstream iss(line);
int vi, vj, l;
iss >> vi >> vj >> l;
if (vi > nr_villages || vj > nr_villages) {
int i = max(vi, vj);
for (int j = nr_villages + 1; j <= i; j++)
roads[j].clear();
nr_villages = i;
}
roads[vi].push_back(make_pair(vj, l));
roads[vj].push_back(make_pair(vi, l));
}
else if (nr_villages) { // end of a set of input
int diameter = 0;
// calculate the diameter (or longest path) of a tree,
// using depth-first search
dfs(1, 0, diameter);
cout << diameter << endl;
nr_villages = 0;
}
else if (!cin.eof()) // no input lines
cout << 0 << endl;
} while (!cin.eof());
return 0;
}
No comments:
Post a Comment