Pagini recente » Cod sursa (job #893312) | Cod sursa (job #345031) | Cod sursa (job #1564558) | Cod sursa (job #1749369) | Cod sursa (job #2686563)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
struct nod
{
int parent;
int depth;
int maxDepth;
int cost;
} graf[15005];
struct muchie
{
int x, y, c;
bool operator<(muchie other)
{
if(other.c == c)
return x < other.x;
return c < other.c;
}
} muchii[30005];
int n, m, k;
int root;
int getRoot(int node)
{
if(graf[node].parent == 0)
return node;
return getRoot(graf[node].parent);
}
int setDepth(int node)
{
if(graf[node].depth != 0)
return graf[node].depth;
graf[node].depth = setDepth(graf[node].parent) + 1;
return graf[node].depth;
}
void read()
{
f>>n>>m>>k;
for(int i = 0; i<m; i++)
{
f>>muchii[i].x>>muchii[i].y>>muchii[i].c;
}
sort(muchii, muchii+m);
}
void buildTree()
{
for(int i = 0; i<m; i++)
{
int r1 = getRoot(muchii[i].x);
int r2 = getRoot(muchii[i].y);
if(r1 == r2)
continue;
if(graf[r1].maxDepth == graf[r2].maxDepth)
{
graf[r2].cost = muchii[i].c;
graf[r2].parent = r1;
graf[r1].maxDepth++;
}
else if(graf[r1].maxDepth > graf[r2].maxDepth)
{
graf[r2].cost = muchii[i].c;
graf[r2].parent = r1;
}
else if(graf[r1].maxDepth < graf[r2].maxDepth)
{
graf[r1].cost = muchii[i].c;
graf[r1].parent = r2;
}
}
root = getRoot(1);
graf[root].depth = 1;
}
void calcDepth()
{
for(int i = 1; i<=n; i++)
{
setDepth(i);
}
}
int findCost(int x, int y)
{
int maxX = 0, maxY = 0;
while(x != y)
{
if(graf[x].depth < graf[y].depth)
{
maxY = max(maxY, graf[y].cost);
y = graf[y].parent;
}
else
{
maxX = max(maxX, graf[x].cost);
x = graf[x].parent;
}
}
return max(maxX, maxY);
}
void solve()
{
int x, y;
for(int i = 0; i<k; i++)
{
f>>x>>y;
g<<findCost(x, y)<<"\n";
}
}
int main()
{
read();
buildTree();
calcDepth();
solve();
return 0;
}