Pagini recente » Cod sursa (job #80600) | Cod sursa (job #3278582)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int n, m, k, x, y, z, f[15001], d[15001][15001];
bool isInFrom[15001];
vector<vector<pair<int, int> > > v(15001);
vector<pair<int, int> > muchii;
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;
priority_queue<pair<int, int>, vector<pair<int, int> > > fq;
int main(){
fin >> n >> m >> k;
for(int i = 1; i <= m; i++){
fin >> x >> y >> z;
v[x].push_back({y, z});
v[y].push_back({x, z});
}
for(int i = 1; i <= k; i++){
fin >> x >> y;
f[x]++;
f[y]++;
muchii.push_back({x, y});
}
for(int i = 1; i <= n; i++){
fq.push({f[i], i});
}
vector<int> from;
int sum = 0;
while(sum < m){
pair<int, int> pairF = fq.top();
fq.pop();
sum += pairF.first;
from.push_back(pairF.second);
isInFrom[pairF.second] = 1;
}
for(auto nod : from){
for(int i = 1; i <= n; i++)
d[nod][i] = 2e9;
d[nod][nod] = 0;
q.push({0, nod});
while(q.size()){
pair<int, int> myPair = q.top();
q.pop();
int myLung = myPair.first;
int myNod = myPair.second;
for(auto vecin : v[myNod]){
int nodVecin = vecin.first;
int lungTunel = vecin.second;
if(d[nod][nodVecin] > max(d[nod][myNod], lungTunel)){
d[nod][nodVecin] = max(d[nod][myNod], lungTunel);
q.push({d[nod][nodVecin], nodVecin});
}
}
}
}
for(auto i : muchii){
if(isInFrom[i.first])
fout << d[i.first][i.second];
else
fout << d[i.second][i.first];
fout << '\n';
}
}