Cod sursa(job #239335)

Utilizator zbarniZajzon Barna zbarni Data 4 ianuarie 2009 16:53:19
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
//kruskal variation
#include<stdio.h>
#include<stdlib.h>
#define nmax 15005
#define nmaxx 30005
struct szar
 {
  int e1,e2;
  long long cost;
 };
szar el[nmaxx];
int fej[nmax],rg[nmax],w[nmax],wer[nmax];
long long max (int val1, int val2)
 {
  return ( (val1 > val2) ? val1: val2);
 }

int cmp (const void *a, const void *b)
 {
  return (((szar*)a)->cost-((szar*)b)->cost);
 }
int go (int x)
 {
  int r;
  for (r=x;fej[r]!=r;r=fej[r]) ;
  return r;
 }

void egyesit (int x,int y,int q)
 {
  if (rg[x]>rg[y])
    fej[y]=x, w[y]=q;
  else
    fej[x]=y, w[x]=q;
  if (rg[x]==rg[y])
    rg[y]++;
 }

void bejar(int x,int r)
 {
  wer[x]+=r;
  if (fej[x]!=x)
    bejar(fej[x],r);
 }

long long fin (int i)
 {
  if (wer[i]==2)
    return 0;
  return max(fin(fej[i]),w[i]);
 }

int main()
 {
  freopen("radiatie.in","r",stdin);
  freopen("radiatie.out","w",stdout);
  int n,m,k,i,x,y;
  scanf("%d%d%d",&n,&m,&k);
  for (i=1;i<=m;++i)
   scanf("%d%d%d",&el[i].e1,&el[i].e2,&el[i].cost);
  el[0].cost=-1;
  qsort(el,m+1,sizeof(szar),cmp);
  int nr=0;
  for(i=1;i<=n;++i)
    {
     rg[i]=1;
     fej[i]=i;
    }
  //kruskal
  int r1,r2;
  for (i=1;nr<n-1;++i)
   {
    r1=go(el[i].e1);
    r2=go(el[i].e2);
    if (r1!=r2)
     {
      nr++;
      egyesit(r1,r2,el[i].cost);
     }
   }
  for (i=1;i<=k;++i)
   {
    scanf("%d%d",&x,&y);
    bejar(x,1);
    bejar(y,1);
    printf("%lld\n",max(fin(x),fin(y)));
    bejar(x,-1);
    bejar(y,-1);
   }
  return 0;
 }