Pagini recente » Cod sursa (job #2791230) | Cod sursa (job #1217858) | Cod sursa (job #2564146) | Cod sursa (job #2238364) | Cod sursa (job #2684455)
#include<fstream>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
int n,m,k,cost,i,a,b;
vector<int> dis[15001];
int tt[15001], ttv[15001], sz[15001], pz1[15001], pz2[15001];
int ans[15002];
struct mch
{
int a;
int b;
int c;
};
mch 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 Uniune(int a, int b)
{
if(sz[a]>=sz[b])
{
tt[b]=a;
sz[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(i=1;i<=m;i++)
f>>v[i].a>>v[i].b>>v[i].c;
sort(v+1,v+m+1,cmp);
for(i=1;i<=k;i++)
{
f>>a>>b;
pz1[i]=a;
pz2[i]=b;
dis[a].push_back(i);
dis[b].push_back(i);
}
for(i=1;i<=n;i++)
{
tt[i]=i;
ttv[i]=i;
sz[i]=1;
}
for(i=1;i<=m;i++)
{
cost=v[i].c;
if(Find1(v[i].a)!=Find1(v[i].b))
Uniune(Find1(v[i].a),Find1(v[i].b));
}
for(i=1;i<=k;i++)
g<<ans[i]<<"\n";
return 0;
}