Pagini recente » Cod sursa (job #461296) | Cod sursa (job #2238755) | Cod sursa (job #1719443) | Cod sursa (job #2412629) | Cod sursa (job #721320)
Cod sursa(job #721320)
#include<fstream>
#include<vector>
#define pb push_back
#define mp make_pair
#define f first
#define s second
using namespace std;
int n,m,k,nh;
struct heap
{
int v1,v2,c;
};
struct arb
{
int c,t,dr;
};
vector< pair <int,int> > g[15002];
heap h[15002];
arb a[15002];
char viz[15002];
void citire()
{
int i,x,y,c;
scanf("%d %d %d",&n,&m,&k);
for(i=1;i<=m;++i)
{
scanf("%d %d %d",&x,&y,&c);
g[x].pb(mp(y,c));
g[y].pb(mp(x,c));
}
}
void swap(int x,int y)
{
heap aux;
aux=h[x];
h[x]=h[y];
h[y]=aux;
}
void heapjos(int k)
{
int x,fs,fd;
do
{
x=0;
fs=2*k;
fd=2*k+1;
if(fs<=nh)
{
x=fs;
if(fd<=nh && h[fd].c < h[fs].c)
x=fd;
if(h[x].c >= h[k].c)
x=0;
}
if(x)
{
swap(x,k);
k=x;
}
}while(x);
}
void heapsus(int k)
{
int x;
x=k/2;
while(k>1 && h[k].c < h[x].c)
{
swap(x,k);
k=x;
x=k/2;
}
}
void sterg()
{
h[1]=h[nh];
--nh;
heapjos(1);
}
void add(int v1,int v2,int c)
{
++nh;
h[nh].v1=v1;
h[nh].v2=v2;
h[nh].c=c;
heapsus(nh);
}
void prim()
{
int v1,v2;
vector< pair <int,int> >::iterator it;
for(it=g[1].begin();it!=g[1].end();++it)
add(1,(*it).f,(*it).s);
viz[1]=1;
a[1].t=0; a[1].c=0; a[1].dr=0;
while(nh)
{
v1=h[1].v1;
v2=h[1].v2;
if(viz[v1]==1 && viz[v2]==0)
{
a[v2].t=v1;
a[v2].c=h[1].c;
a[v2].dr=a[v1].dr+1;
viz[v2]=1;
sterg();
for(it=g[v2].begin();it!=g[v2].end();++it)
if(viz[(*it).f]==0)
add(v2,(*it).f,(*it).s);
}
else
sterg();
}
}
void rezolv()
{
int i,x,y,dmax;
for(i=1;i<=k;++i)
{
scanf("%d %d",&x,&y);
dmax=-1;
while(a[x].dr < a[y].dr)
{
if(a[y].c > dmax)
dmax=a[y].c;
y=a[y].t;
}
while(a[x].dr > a[y].dr)
{
if(a[x].c > dmax)
dmax=a[x].c;
x=a[x].t;
}
while(x!=y)
{
if(a[x].c > dmax)
dmax=a[x].c;
if(a[y].c > dmax)
dmax=a[y].c;
x=a[x].t;
y=a[y].t;
}
printf("%d\n",dmax);
}
}
int main()
{
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
citire();
prim();
rezolv();
fclose(stdin);
fclose(stdout);
return 0;
}