Pagini recente » Cod sursa (job #420323) | Cod sursa (job #1003278) | Cod sursa (job #119443) | Cod sursa (job #2046401) | Cod sursa (job #3193678)
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>
using namespace std;
ifstream fin ("radiatie.in");
ofstream fout("radiatie.out");
int n,m,Q,i,j,nr,T[15003],D[15003],r,x,y,maxim;
bitset<15003> viz;
struct elem
{
int x,y,cost;
}V[30003];
vector < pair<int,int> > A[30003];
bool cmp(elem a,elem b){ return a.cost<b.cost;}
int get_root(int x)
{
while(T[x]>0)
x=T[x];
return x;
}
void join(int x,int y)
{
int root_a=get_root(x);
int root_b=get_root(y);
if(root_a==root_b)
return;
if(T[root_a]>T[root_b])
swap(root_a,root_b);
T[root_a]+=T[root_b];
T[root_b]=root_a;
}
bool query(int x, int y){ return get_root(x)!=get_root(y);}
void dfs(int x)
{
viz[x]=1;
for(int j=0;j<A[x].size();j++)
{
int vecin=A[x][j].first;
int cost=A[x][j].second;
if(!viz[vecin])
{
D[vecin]=cost;
T[vecin]=x;
dfs(vecin);
}
}
}
void lca1(int x)
{
if(!viz[x])
viz[x]=1;
else
{
viz[x]=0;
return;
}
if(T[x])
lca1(T[x]);
}
void lca2(int x)
{
if(!viz[x])
return;
maxim=max(maxim,D[x]);
if(T[x])
lca2(T[x]);
}
int main()
{
fin>>n>>m>>Q;
for(i=1;i<=m;i++)
fin>>V[i].x>>V[i].y>>V[i].cost;
for(i=1;i<=n;i++)
T[i]=-1;
sort(V+1,V+m+1,cmp);
for(i=1;i<=m;i++)
{
if(query(V[i].x,V[i].y))
{
join(V[i].x,V[i].y);
nr++;
A[V[i].x].push_back({V[i].y,V[i].cost});
A[V[i].y].push_back({V[i].x,V[i].cost});
if(nr==n-1)
break;
}
}
for(i=1;i<=n;i++)
if(T[i]<0)
{
r=i;
break;
}
dfs(r);
T[r]=0;
D[r]=0;
for(i=1;i<=Q;i++)
{
fin>>x>>y;
viz.reset();
maxim=0;
lca1(x);
lca1(y);
lca2(x);
lca2(y);
fout<<maxim<<"\n";
}
return 0;
}