Pagini recente » Cod sursa (job #830139) | Monitorul de evaluare | Cod sursa (job #1948743) | Cod sursa (job #499049) | Cod sursa (job #811532)
Cod sursa(job #811532)
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
#define NMAX 60001
#define mp make_pair
#define pb push_back
#define x first
#define y second
vector < pair < int , pair < int , int > > > v;
int p[NMAX],rang[NMAX],c[NMAX],viz[NMAX];
int multime(int x)
{
while(x!=p[x])
x=p[x];
return x;
}
void reuneste(int x, int y, int cost)
{
x=multime(x);
y=multime(y);
if(rang[x]<rang[y]) {
p[x]=y;
c[x]=cost;
}
else {
p[y]=x;
c[y]=cost;
}
if(rang[x]==rang[y])
rang[y]++;
}
int lca(int x, int y, int nr)
{
viz[x]=nr;
while(x!=p[x]) {
viz[p[x]]=nr;
x=p[x];
}
while(y!=p[y] && viz[y]!=nr)
y=p[y];
return y;
}
int maxim(int x, int y, int nr)
{
int maxx,r;
r=lca(x,y,nr);
maxx=0;
while(x!=r) {
maxx=max(maxx,c[x]);
x=p[x];
}
while(y!=r) {
maxx=max(maxx,c[y]);
y=p[y];
}
return maxx;
}
int main ()
{
int i,nrk,n,m,x,y,cost;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
f>>n>>m>>nrk;
for(i=1;i<=m;i++) {
f>>x>>y>>cost;
v.pb ( mp ( cost , mp ( x , y ) ) );
}
for(i=1;i<=n;i++) {
p[i]=i;
rang[i]=1;
}
sort(v.begin(),v.end());
for(i=0;i<=m-1;i++)
if(multime(v[i].y.x)!=multime(v[i].y.y))
reuneste(v[i].y.x,v[i].y.y,v[i].x);
for(i=1;i<=nrk;i++) {
f>>x>>y;
g<<maxim(x,y,i)<<'\n';
}
f.close();
g.close();
return 0;
}