Pagini recente » Cod sursa (job #603852) | Cod sursa (job #1285458) | Cod sursa (job #369325) | Cod sursa (job #28656) | Cod sursa (job #2452671)
#include<bits/stdc++.h>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
int n, m, k, cost;
vector<int>dis[15001];
int tt[15001], ttv[15001], sz[15001], pz1[15001], pz2[15001];
int ans[15002];
struct mch
{
int a, b, c;
} v[30002];
bool cmp(mch a, mch b)
{
return a.c<b.c;
}
int Find1(int nod)
{
if(tt[nod]==nod)
return nod;
return tt[nod]=Find1(tt[nod]);
}
int Find2(int nod)
{
if(ttv[nod]==nod)
return nod;
return ttv[nod]=Find2(ttv[nod]);
}
void Union(int a, int b)
{
if(sz[a]>=sz[b])
{
tt[b]=a;
sz[a]+=sz[b];
}
else
{
tt[a]=b;
sz[b]+=sz[a];
}
int x=Find2(ttv[a]);
int y=Find2(ttv[b]);
if(dis[x].size()<dis[y].size())
swap(x, y);
for(int i=0; i<dis[y].size(); i++)
{
int val=dis[y][i];
if(Find2(pz1[val])==x && Find2(pz2[val])==y)
ans[val]=cost;
else
{
if(Find2(pz1[val])==y && Find2(pz2[val])==x)
ans[val]=cost;
else
dis[x].push_back(val);
}
}
ttv[y]=x;
}
int main()
{
f>>n>>m>>k;
for(int i=1; i<=m; i++)
f>>v[i].a>>v[i].b>>v[i].c;
sort(v+1, v+m+1, cmp);
for(int i=1; i<=k; i++)
{
int a, b;
f>>a>>b;
pz1[i]=a;
pz2[i]=b;
dis[a].push_back(i);
dis[b].push_back(i);
}
for(int i=1; i<=n; i++)
{
tt[i]=i;
ttv[i]=i;
sz[i]=1;
}
for(int i=1; i<=m; i++)
{
cost=v[i].c;
if(Find1(v[i].a)!=Find1(v[i].b))
Union(Find1(v[i].a), Find1(v[i].b));
}
for(int i=1; i<=k; i++)
g<<ans[i]<<'\n';
return 0;
}