Nu aveti permisiuni pentru a descarca fisierul grader_test8.in
Cod sursa(job #8052)
Utilizator | Data | 23 ianuarie 2007 19:30:11 | |
---|---|---|---|
Problema | Radiatie | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.65 kb |
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn2 = 40;
const int maxn = 30001;
int mat[maxn2][maxn],mat2[maxn2][maxn];
int i,j,n,m,k,x1,y1,c[maxn],a[maxn],b[maxn],ind[maxn];
int g[maxn],niv[maxn];
vector <int> vect[maxn];
vector <int> vect2[maxn];
int i1,mini;
int k1;
void dfs(int i)
{
vector <int>:: iterator it;
vector <int>:: iterator it2;
for(it2=vect2[i].begin(), it=vect[i].begin();it!=vect[i].end();it++ , it2++)
if (niv[*it]==0)
{
niv[*it]=niv[i]+1;
mat[0][*it]=*it2;
mat2[0][*it]=i;
dfs(*it);
}
}
bool cmpf(const int &a,const int &b)
{
return c[a]<c[b];
}
int grupa(int i)
{
if (g[i]!=i)
{
g[i]=grupa(g[i]);
return g[i];
}
return i;
}
void reuneste(int i,int j)
{
if (i>j)
{
int aux=i;
i=j;
j=aux;
}
g[grupa(j)]=g[grupa(i)];
}
int max(int i,int j)
{
if (i>j) return i;
return j;
}
int main()
{
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
scanf("%d %d %d",&n,&m,&k1);
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&a[i],&b[i],&c[i]);
ind[i]=i;
}
for(i=1;i<=n;i++)
{
g[i]=i;
}
sort(ind+1,ind+m+1,cmpf);
for(i1=1;i1<=m;i1++)
{
i=ind[i1];
if (grupa(a[i])!=grupa(b[i]))
{
reuneste(a[i],b[i]);
vect[a[i]].push_back(b[i]);
vect2[a[i]].push_back(c[i]);
vect[b[i]].push_back(a[i]);
vect2[b[i]].push_back(c[i]);
}
}
niv[1]=1;
dfs(1);
int x2=1;
for(j=1;(x2<<j)<n;j++)
{
for(i=1;i<=n;i++)
{
mat[j][i]=max(mat[j-1][mat2[j-1][i]],mat[j-1][i]);
mat2[j][i]=mat2[j-1][mat2[j-1][i]];
}
}
for(i=1;i<=k1;i++)
{
scanf("%d %d",&x1,&y1);
if (niv[x1]<niv[y1])
{
int aux=x1;
x1=y1;
y1=aux;
}
mini=0;
int l=niv[x1]-niv[y1];
for(k=j;k>=0;k--)
{
if ((x2<<k)<=l)
{
if (mini<mat[k][x1])mini=mat[k][x1];
x1=mat2[k][x1];
l-=(x2<<k);
}
}
for(k=j;k>=0;k--)
{
if (mat2[k][x1]!=mat2[k][y1])
{
if (mini<mat[k][x1]) mini=mat[k][x1];
if (mini<mat[k][y1]) mini=mat[k][y1];
x1=mat2[k][x1];
y1=mat2[k][y1];
}
}
if (x1!=y1)
{
if (mini<mat[0][x1]) mini=mat[0][x1];
if (mini<mat[0][y1]) mini=mat[0][y1];
}
printf("%d\n",mini);
}
return 0;
}