Pagini recente » Cod sursa (job #700907) | Cod sursa (job #379404) | Cod sursa (job #2365399) | Cod sursa (job #306806) | Cod sursa (job #2171994)
#include <fstream>
#include <vector>
#include <queue>
#include <functional>
#define M 2000000000
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int n, m, k, x, y, c, viz[15010], grad[15010], i, Max;
struct tata
{
int c, nod;
}t[15010];
vector < pair < int, int > > g[30010];
priority_queue < pair < int, int >, vector < pair < int, int > >, greater < pair < int, int > > > qu;
void apm()
{
for(int j = 2; j <= n; j++)
{
t[j].c = M;
}
qu.push({0, 1});
while(!qu.empty())
{
int nod = qu.top().second;
qu.pop();
if(viz[nod] == 0)
{
viz[nod] = 1;
for(int i = 0; i < g[nod].size(); i++)
{
if(viz[g[nod][i].first] == 0)
{
if(t[g[nod][i].first].c > g[nod][i].second)
{
t[g[nod][i].first].c = g[nod][i].second;
t[g[nod][i].first].nod = nod;
grad[g[nod][i].first] = grad[nod] + 1;
}
qu.push({t[g[nod][i].first].c, g[nod][i].first});
}
}
}
}
}
void Find(int x, int y)
{
while(x != y)
{
if(t[x].c > Max)
Max = t[x].c;
if(t[y].c > Max)
Max = t[y].c;
x = t[x].nod;
y = t[y].nod;
}
}
void drum(int x, int y)
{
while(grad[x] > grad[y])
{
if(t[x].c > Max)
Max = t[x].c;
x = t[x].nod;
}
Find(x, y);
}
int main()
{
fin >> n >> m >> k;
for(i = 1; i <= m; i++)
{
fin >> x >> y >> c;
g[x].push_back({y, c});
g[y].push_back({x, c});
}
apm();
// for(i = 1; i <= n; i++)
// {
// fout <<i << " "<< grad[i]<< " " << t[i].nod << " "<<t[i].c <<'\n';
// }
for(i = 1; i <= k; i++)
{
fin >> x >> y;
Max = 0;
if(grad[x] > grad[y])
drum(x, y);
else
drum(y, x);
fout << Max << '\n';
}
return 0;
}