Pagini recente » Cod sursa (job #1356066) | Cod sursa (job #1877123) | Cod sursa (job #497652) | Cod sursa (job #532667) | Cod sursa (job #1490076)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
struct Edge{
int x,y,c;
bool operator< (Edge a) const
{
return c<a.c;
}
}edge[31000];
struct noduri{
int parent,CostToGrow,niv;
}nod[16000];
int i,n,k,m,x,y;
int Top(int nod,int &Deep)
{
Deep=0;
while(::nod[nod].parent!=nod)
{
nod=::nod[nod].parent;
Deep++;
}
return nod;
}
void apm()
{
int RemainingEdges=n-1;
int Xparent,Yparent,Xdeep,Ydeep,i=1;
while(i<=m && RemainingEdges!=0)
{
Xparent=Top(edge[i].x,Xdeep);
Yparent=Top(edge[i].y,Ydeep);
if(Xparent!=Yparent)
{
if(Xdeep>=Ydeep)
{
nod[edge[i].y].parent=Xparent;
nod[edge[i].y].CostToGrow=edge[i].c;
}
else
{
nod[edge[i].x].parent=Yparent;
nod[edge[i].x].CostToGrow=edge[i].c;
}
RemainingEdges--;
}
i++;
}
}
int Rate(int nod)
{
if(::nod[nod].parent==nod)
return (::nod[nod].niv=1)+1;
if(::nod[nod].niv!=0)
return ::nod[nod].niv+1;
else
return (::nod[nod].niv = Rate(::nod[nod].parent))+1;
}
int maxEdge(int nod1,int nod2)
{
int Max=0;
while(nod1!=nod2)
{
if(nod[nod1].niv<=nod[nod2].niv)
{
if(nod[nod2].CostToGrow>Max)
Max=nod[nod2].CostToGrow;
nod2=nod[nod2].parent;
}
else
{
if(nod[nod1].CostToGrow>Max)
Max=nod[nod1].CostToGrow;
nod1=nod[nod1].parent;
}
}
return Max;
}
int main()
{
fin>>n>>m>>k;
for (i=1;i<=m;i++)
fin>>edge[i].x>>edge[i].y>>edge[i].c;
for (i=1;i<=n;i++)
nod[i].parent=i;
sort(edge+1,edge+m+1);
apm();
for (i=1;i<=n;i++)
if (nod[i].niv==0)
Rate(i);
for (i=1;i<=k;i++)
{
fin>>x>>y;
fout<<maxEdge(x,y)<<'\n';
}
return 0;
}