Pagini recente » Cod sursa (job #2119865) | Cod sursa (job #1925028) | Cod sursa (job #671361) | Cod sursa (job #2360512) | Cod sursa (job #2491201)
#include <fstream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <bitset>
#define dim 15010
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int n,m,T,k,i,j,q,x,y,rx,ry,t[dim],E[2*dim],N[2*dim],P[2*dim],F[dim];
vector <pair<int,int> > l[dim];
int D[16][2*dim];
int dist[2*dim];
bitset <2*dim> f;
struct muchii{
int x;
int y;
int c;
} v[2*dim];
bool cmp(const muchii &a, const muchii &b){
return a.c<b.c;
}
int rad(int x){
while(t[x]>0)
x=t[x];
return x;
}
void upd(int x, int rx){
int y;
while(t[x]>0){
y=t[x];
t[x]=rx;
x=y;
}
}
void dfs(int nod,int niv){
f[nod]=1;
E[++k]=nod;
N[k]=niv;
F[nod]=k;
for(int i=0;i<l[nod].size();i++){
int vec=l[nod][i].first;
int cost=l[nod][i].second;
if(!f[vec]){
dist[vec]=dist[nod]+cost;
dfs(vec,niv+1);
E[++k]=nod;
N[k]=niv;
}
}
}
int main(){
fin>>n>>m>>T;
for(q=1;q<=m;q++)
fin>>v[q].x>>v[q].y>>v[q].c;
sort(v+1,v+m+1,cmp);
for(i=1;i<=n;i++)
t[i]=-1;
for(q=1;q<=m;q++){
x=v[q].x; y=v[q].y;
rx=rad(x); upd(x,rx);
ry=rad(y); upd(y,ry);
if(rx!=ry){
if(t[rx]<t[ry]){
t[rx]+=t[ry];
t[ry]=rx;
}else{
t[ry]+=t[rx];
t[rx]=ry;
}
cout<<x<<" "<<y<<" "<<v[q].c<<"\n";
l[x].push_back(make_pair(y,v[q].c));
l[y].push_back(make_pair(x,v[q].c));
}
}
dfs(1,1);
for(i=1;i<=k;i++){
P[i]=1+P[i/2];
D[0][i]=i;
}
for(i=1;i<=P[k];i++){
for(j=1;j<=k;j++){
D[i][j]=D[i-1][j];
if( j+(1<<(i-1))<=k && N[ D[i][j] ]>N[ D[i-1][j+(1<<(i-1))]] )
D[i][j]=D[i-1][j+(1<<(i-1))];
}
}
for(;T;T--){
fin>>i>>j;
x=F[i]; y=F[j];
if(x>y)
swap(x,y);
q=P[y-x+1];
if(N[ D[q][x] ] < N[ D[q][y-(1<<q)+1] ]){
cout<<E[D[q][x]]<<"\n";
fout<<dist[i]-dist[E[D[q][x]]]+dist[j]-dist[E[D[q][x]]]<<"\n";
}else{
fout<<dist[i]-dist[E[D[q][y-(1<<q)+1]]]+dist[j]-dist[E[D[q][y-(1<<q)+1]]]<<"\n";
}
}
return 0;
}