Pagini recente » Cod sursa (job #319952) | Borderou de evaluare (job #962052) | Borderou de evaluare (job #2021451) | Borderou de evaluare (job #713059) | Cod sursa (job #2651604)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin ("radiatie.in");
ofstream fout ("radiatie.out");
struct muchie
{
int a, b, c;
}v[30001];
int tt[15001], rg[15001], ct[15001], sterg[15001], maxlat[15001];
bool f[15001];
int comparare (muchie x, muchie y)
{
return x.c<y.c;
}
int find (int x)
{
while(tt[x]!=x)
{
x=tt[x];
}
return x;
}
void unite (int x, int y , int c)
{
if(rg[x]>rg[y])
{
tt[y]=x;
ct[y]=c;
}
else
{
tt[x]=y;
ct[x]=c;
}
if(rg[x]==rg[y]) rg[y]++;
}
int main()
{
int n, m, k, i, y, a, b, co;
fin>>n>>m>>k;
for(i=1; i<=m; i++)
{
fin>>v[i].a>>v[i].b>>v[i].c;
}
sort(v+1, v+m+1, comparare);
for(i=1; i<=n; i++)
{
tt[i]=i;
rg[i]=1;
}
//Aplic algoritmul lui Kruskal
co=0;
i=1;
while(co<n-1)
{
int raux1=find(v[i].a);
int raux2=find(v[i].b);
if(raux1!=raux2)
{
co++;
unite(raux1, raux2, v[i].c);
}
i++;
}
//cout<<"\n";
for(y=1; y<=k; y++)
{
fin>>a>>b;
if(a==b) fout<<0<<"\n";
else
{
maxlat[a]=0;
maxlat[b]=0;
int numar_sterg=0;
while(tt[a]!=tt[b] && f[ tt[a] ]==0 && f[ tt[b] ]==0)
{
//daca parintii inca nu s-au intalnit
sterg[++numar_sterg]=tt[a];
sterg[++numar_sterg]=tt[b];
f[ tt[a] ]=1;
f[ tt[b] ]=1;
maxlat[ tt[a] ] = max(maxlat[a], ct[a]) ;
a=tt[a];
maxlat[ tt[b] ] = max(maxlat[b], ct[b]) ;
b=tt[b];
}
//maxlat[ tt[a] ] = max(maxlat[a], ct[a]) ;
//maxlat[ tt[b] ] = max(maxlat[b], ct[b]) ;
if(f[ tt[b] ]==1) fout<<max( maxlat[ tt[b] ], ct[b] ) <<"\n";
else if( f[ tt[a] ]==1) fout<<max( maxlat[ tt[a] ], ct[a])<<"\n";
else fout<<max(max(max(maxlat[a], ct[a]), maxlat[b] ), ct[b] )<<"\n";
for(i=1; i<=numar_sterg; i++)
{
f[ sterg[i] ]=0;
}
}
}
}