Pagini recente » Cod sursa (job #2754985) | Cod sursa (job #1373253) | Cod sursa (job #306512) | Cod sursa (job #472940) | Cod sursa (job #1517544)
#include <fstream>
#include <vector>
#include <algorithm>
#define nMax 15005
#define mMax 30005
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int Tata[nMax], dist[nMax], Root[nMax], Lev[nMax], n, m, q, a, b, i, tp, val1, val2;
vector<pair<int, int> > G[nMax];
struct muchii
{
int a;
int b;
int c;
}Edge[mMax];
int cmp(muchii o, muchii p)
{
return o.c<p.c;
}
int getRoot(int node)
{
if(Root[node]==node)
return node;
Root[node]=getRoot(Root[node]);
return Root[node];
}
void DFS(int node, int tata, int lvl)
{
Tata[node]=tata;
Lev[node]=lvl;
for(vector<pair<int, int> >::iterator it=G[node].begin();it!=G[node].end();it++)
if(it->first!=tata)
{
dist[it->first]=it->second;
DFS(it->first, node, lvl+1);
}
}
int LCA(int a, int b)
{
int Max=0;
if(Lev[b]>Lev[a])
swap(a, b);
while(Lev[a]>Lev[b])
{
Max=max(Max, dist[a]);
a=Tata[a];
}
while(a!=b)
{
Max=max(Max, max(dist[a], dist[b]));
a=Tata[a];
b=Tata[b];
}
return Max;
}
int main()
{
fin>>n>>m>>q;
for(i=1;i<=m;i++)
fin>>Edge[i].a>>Edge[i].b>>Edge[i].c;
for(i=1;i<=n;i++)
Root[i]=i;
sort(Edge+1, Edge+m+1, cmp);
tp=n-1;
for(i=1;i<=m&&tp!=0;i++)
{
val1=getRoot(Edge[i].a);
val2=getRoot(Edge[i].b);
if(val1!=val2)
{
G[Edge[i].a].push_back(make_pair(Edge[i].b, Edge[i].c));
G[Edge[i].b].push_back(make_pair(Edge[i].a, Edge[i].c));
Root[val1]=val2;
tp--;
}
}
DFS(1, -1, 1);
for(i=1;i<=q;i++)
{
fin>>a>>b;
fout<<LCA(a, b)<<'\n';
}
return 0;
}