Pagini recente » Cod sursa (job #2882694) | Cod sursa (job #2711529) | Cod sursa (job #1367639) | Cod sursa (job #2477791) | Cod sursa (job #3286884)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
struct Nod
{
int a,b,c;
}v[30005];
int root[30005],depth[30005],marked[30005];
bool cmp(Nod x,Nod y)
{
return x.c<y.c;
}
int find_root(int a)
{
if(a==root[a])
return a;
return find_root(root[a]);
}
void UNION(int a,int b)
{
if(depth[a]<depth[b])
{
root[a]=b;
}
else if(depth[a]>depth[b])
{
root[b]=a;
}
else
{
root[a]=b;
depth[a]++;
}
}
vector <pair<short,int>> V[15005];
int minn[15][15005],stramosi[15][15005],visited[15005];
void dfs(int k)
{
for(auto N:V[k])
{
int x=N.first,y=N.second;
if(visited[x]==0)
{
//fout<<k<<" "<<x<<" "<<y<<"\n";
visited[x]=1;
minn[0][x]=y;
stramosi[0][x]=k;
depth[x]=depth[k]+1;
dfs(x);
}
}
}
int main()
{
int n,m,Q;
fin>>n>>m>>Q;
for(int i=1;i<=m;i++)
{
fin>>v[i].a>>v[i].b>>v[i].c;
}
sort(v+1,v+n+1,cmp);
for(int i=1;i<=n;i++)
root[i]=depth[i]=i;
int counter=0;
for(int i=1;i<=m;i++)
if(counter<n-1)
{
int a=v[i].a,b=v[i].b,c=v[i].c;
a=find_root(a);
b=find_root(b);
if(a!=b)
{
UNION(a,b);
marked[i]=1;
counter++;
}
}
for(int i=1;i<=n;i++)
depth[i]=0;
for(int i=1;i<=m;i++)
if(marked[i])
{
int a=v[i].a,b=v[i].b,c=v[i].c;
//fout<<a<<" "<<b<<" "<<c<<"\n";
V[a].push_back({b,c});
V[b].push_back({a,c});
}
visited[1]=1;
dfs(1);
minn[0][1]=1000000007;
for(int i=1;i<=16;i++)
for(int j=1;j<=n;j++)
{
minn[i][j]=min(minn[i-1][j],minn[i-1][stramosi[i-1][j]]);
stramosi[i][j]=stramosi[i-1][stramosi[i-1][j]];
}
for(int q=1;q<=Q;q++)
{
int a,b,ca,cb;
fin>>a>>b;
if(depth[a]<depth[b])
swap(a,b);
ca=a;
cb=b;
int response=0;
for(int i=16;i>=0;i--)
if(depth[ca]-(1<<i)>depth[b])
{
response=max(response,minn[i][ca]);
ca=stramosi[i][ca];
}
if(depth[ca]!=depth[b])
{
response=max(response,minn[0][ca]);
ca=stramosi[0][ca];
}
if(ca==b)
{
fout<<response<<'\n';
}
else
{
for(int i=16;i>=0;i--)
if(stramosi[i][ca]!=stramosi[i][cb])
{
response=max(response,minn[i][ca]);
response=max(response,minn[i][cb]);
ca=stramosi[i][ca];
cb=stramosi[i][cb];
}
fout<<response<<'\n';
}
}
return 0;
}