Pagini recente » Cod sursa (job #1418474) | Cod sursa (job #3030422) | Cod sursa (job #3315810) | Cod sursa (job #900512) | Cod sursa (job #3327209)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=15e3+5;
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
int p[maxn];
int sz[maxn];
int rsp[30005];
struct Edges {
int l,r,cost;
bool operator<(const Edges &e) const {
return cost < e.cost;
}
};
vector<Edges> edg;
struct query {
int l,r,indi;
};
vector<query> q;
vector<query> nou;
int findd(int x) {
if (x==p[x])return x;
return p[x]=findd(p[x]);
}
void unite(int a,int b) {
a=findd(a);
b=findd(b);
if (a==b)return;
if (sz[a]<sz[b]) {
p[a]=b;
sz[b]+=sz[a];
}else {
p[b]=a;
sz[a]+=sz[b];
}
}
void solve() {
int n,m,k;
cin>>n>>m>>k;
for (int i=1;i<=n;i++) {
p[i]=i;
sz[i]=1;
}
for (int i=1;i<=m;i++) {
Edges e;
cin>>e.l>>e.r>>e.cost;
edg.push_back(e);
}
sort(edg.begin(),edg.end());
for (int i=1;i<=k;i++) {
query x;
cin>>x.l>>x.r;
x.indi=i;
q.push_back(x);
}
for (int i=0;i<m;i++) {
int cost=edg[i].cost;
int j=i;
while (cost==edg[j].cost && j<m) {
int nod1=edg[j].l,nod2=edg[j].r,cost2=edg[j].cost;
unite(nod1,nod2);
j++;
}
i=j-1;
for (auto qx:q) {
int nod3=qx.l,nod4=qx.r,indi=qx.indi;
if (findd(nod3)==findd(nod4)) {
rsp[indi]=cost;
//cout<<nod3<<" "<<nod4<<endl;
}else nou.push_back(qx);
}
q=nou;
nou.clear();
if (q.size()==0)break;
}
for (int i=1;i<=k;i++) {
cout<<rsp[i]<<"\n";
}
}
signed main() {
int t;
t=1;
while(t--)solve();
return 0;
}