Pagini recente » Cod sursa (job #2820) | Cod sursa (job #1977085) | Cod sursa (job #1042561) | Cod sursa (job #1346455) | Cod sursa (job #1265495)
#include <fstream>
#include <algorithm>
#define NMAX 15004
#define MMAX 30004
using namespace std;
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
struct nod{int nr,c;nod*urm;};
typedef nod*Lista;
Lista lis[NMAX];
struct elem{int x,y,c;} v[MMAX];
int n,m,k,comp[NMAX],que[NMAX],urm[NMAX],niv[NMAX],cst[NMAX];
void read();
void solve();
void inserare(Lista&,int,int);
bool compare(elem a,elem b);
void APM();
int minim(int,int);
void bfs();
int main()
{
read();
sort(v+1,v+m+1,compare);
APM();
bfs();
solve();
cin.close();cout.close();
return 0;
}
void read()
{
int i;
cin>>n>>m>>k;
for (i=1;i<=m;i++)
cin>>v[i].x>>v[i].y>>v[i].c;
for (i=1;i<=n;i++)
{comp[i]=i;lis[i]=NULL;}
}
bool compare(elem a,elem b)
{
return (a.c<b.c);
}
void APM()
{
int p=1,i,naux=n,mn,mx;
while (naux>1)
{
if (comp[v[p].x]!=comp[v[p].y])
{
if (comp[v[p].x]>comp[v[p].y])
{
mn=comp[v[p].y];
mx=comp[v[p].x];
}
else
{
mx=comp[v[p].y];
mn=comp[v[p].x];
}
inserare(lis[v[p].x],v[p].y,v[p].c);
inserare(lis[v[p].y],v[p].x,v[p].c);
for (i=1;i<=n;i++)
if (comp[i]==mx) comp[i]=mn;
naux--;
}
p++;
}
}
void inserare(Lista& prim,int nr,int c)
{
Lista aux;
aux=new nod;
aux->nr=nr;
aux->c=c;
aux->urm=prim;
prim=aux;
}
void bfs()
{
int p=1,u=1;Lista aux;
que[p]=1;urm[1]=0;niv[1]=1;
while (p<=u)
{
aux=lis[que[p]];
while (aux!=NULL)
{
while (niv[aux->nr]==0)
{
niv[aux->nr]=niv[que[p]]+1;
urm[aux->nr]=que[p];
cst[aux->nr]=aux->c;
que[++u]=aux->nr;
}
aux=aux->urm;
}
p++;
}
}
void solve()
{
int i,x,y;
for (i=1;i<=k;i++)
{
cin>>x>>y;
cout<<minim(x,y)<<'\n';
}
}
int minim(int x,int y)
{
int i=x,j=y,sol=0;
while (niv[i]>niv[j])
{
if(cst[i]>sol) sol=cst[i];
i=urm[i];
}
while (niv[i]<niv[j])
{
if(cst[j]>sol) sol=cst[j];
j=urm[j];
}
while (i!=j)
{
if(cst[i]>sol) sol=cst[i];
if(cst[j]>sol) sol=cst[j];
i=urm[i];
j=urm[j];
}
return sol;
}