Pagini recente » Cod sursa (job #1981925) | Cod sursa (job #273091) | Cod sursa (job #1332499) | Cod sursa (job #992292) | Cod sursa (job #1693953)
#include <iostream>
#include<fstream>
#include<algorithm>
using namespace std;
int tt[15005],rg[15005],noq,q,n,x,y,cost[15005],newcost[15005],m,i,ok,lmin,mark[15005];
struct muchie
{
int a,b,c;
}v[30005];
bool compare(muchie x,muchie y)
{
return x.c<y.c;
}
int cauta(int x)
{
while(x!=tt[x])
x=tt[x];//aplic padurile
//dar fara compresia drumurilor,ca arborele rezultat sa
//fie chiar apm-ul
return x;
}
void uneste(int x,int y,int par)//par reprezinta costul drumului catre tatal nodului
{
if(rg[x]>rg[y]) {tt[y]=x;cost[y]=par;}
else {tt[x]=y;cost[x]=par;}
if(rg[x]==rg[y]) rg[y]++;//reunesc dupa rang
return;
}
inline void kruskal()
{
//gasesc apm-ul,ca sa am cele mai mici muchii care nu formeaza un ciclu
sort(v+1,v+m+1,compare);
for(i=1;i<=m;i++)
{
if(cauta(v[i].a)!=cauta(v[i].b))
uneste(cauta(v[i].a),cauta(v[i].b),v[i].c);
}
}
int query(int x,int y)
{
//mark reprezinta ultimul query la care nodul a fost marcat,
//lca-ul se gaseste in momentul in care dau de un nod pentru care mark==q
newcost[x]=0;
newcost[y]=0;
mark[x]=q;
mark[y]=q;
ok=0;
while(!ok)
{
if(mark[tt[x]]==q&&x!=tt[x])
{
newcost[tt[x]]=max(newcost[tt[x]],cost[x]);
ok=newcost[tt[x]];
}
mark[tt[x]]=q;
newcost[tt[x]]=max(cost[x],newcost[x]);
x=tt[x];
if(mark[tt[y]]==q&&y!=tt[y])
{
newcost[tt[y]]=max(newcost[tt[y]],cost[y]);
ok=newcost[tt[y]];
}
mark[tt[y]]=q;
newcost[tt[y]]=max(cost[y],newcost[y]);
y=tt[y];
}
return ok;
}
int main()
{
ifstream f("radiatie.in");
ofstream g("radiatie.out");
f>>n>>m>>noq;
for(i=1;i<=m;i++)
{
f>>v[i].a>>v[i].b>>v[i].c;
}
for(i=1;i<=n;i++)
{
tt[i]=i;
rg[i]=1;
}
kruskal();
for(q=1;q<=noq;q++)
{
f>>x>>y;
lmin=query(x,y);
g<<lmin<<'\n';
}
return 0;
}