Pagini recente » Cod sursa (job #14247) | Cod sursa (job #1125640) | Cod sursa (job #1476483) | Cod sursa (job #1630883) | Cod sursa (job #2709739)
#include <bits/stdc++.h>
#define Nmax 15001
using namespace std;
ifstream f("radiatie.in"); ofstream g("radiatie.out");
int n,m,T,h[Nmax],t[Nmax],lev[Nmax],c[Nmax];
struct edge {int x, y, c;} e[30001];
int Level(int nod)
{ if ( lev[nod] != 0 ) return lev[nod];
if ( t[nod] == nod ) return 1;
return (lev[nod] = Level(t[nod]) + 1);
}
int Find(int nod)
{ if(t[nod]!=nod) return Find(t[nod]);
return t[nod];
}
void Union(int i, int j, int k)
{ if(h[i]>h[j]) {t[j]=i; c[j]=e[k].c;}
else
{ t[i]=j; c[i]=e[k].c;
if(h[i]== h[j]) h[j]++;
}
}
void Qsort(int st, int dr)
{ int i=st-1,j= dr+1;
do
{ do i++; while(e[i].c<e[st].c);
do j--; while(e[st].c<e[j].c);
if(i<=j) {edge aux = e[i]; e[i]=e[j];e[j]=aux;}
} while(i<=j);
if(i<dr) Qsort(i,dr);
if(st<j) Qsort(st,j);
}
void Kruskal()
{ Qsort(1,m);
for(int i=1;i<=n;i++) {t[i]=i; h[i]=1;c[i]=0;}
int nrm=n;
for(int k=1;k<=m;k++)
{ if(nrm==1) break;
int r1 = Find(e[k].x);
int r2 = Find(e[k].y);
if(r1!=r2) {Union(r1,r2,k); nrm--;}
}
for(int i=1;i<=n;i++) Level(i);
}
int main()
{ f>>n>>m>>T;
for(int i=1;i<=m;i++) f>>e[i].x>>e[i].y>>e[i].c;
Kruskal();
for(int a,b;T;--T)
{ f>>a>>b;
int cmax=0;
while(lev[a]>lev[b]) {cmax=max(cmax, c[a]); a=t[a];}
while(lev[b]>lev[a]) {cmax=max(cmax, c[b]); b=t[b];}
while(a!=b) {cmax=max(cmax,max(c[a],c[b])); a=t[a]; b = t[b];}
g<<cmax<<'\n';
}
g.close(); f.close(); return 0;
}