Cod sursa(job #1265522)

Utilizator Lucian_BosinceanuLucian-Andrei Bosinceanu Lucian_Bosinceanu Data 17 noiembrie 2014 13:38:47
Problema Radiatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#define DMAX 30005

using namespace std;

FILE*fin=fopen("radiatie.in","r");
FILE*fout=fopen("radiatie.out","w");

struct muchie
{
int x,y,cost;
};

struct vecin
{
int varf,cost;
};

void citire();
bool sortare(muchie a,muchie b);
void kruskal();
void fagrafprim();
void DFS(int nod,int parinte,int nivel,int cost);
int querry(int x,int y);
void rezolvare();

vector<vecin> Gprim[DMAX];
muchie G[DMAX],GAPM[DMAX];
int conex[DMAX],level[DMAX],father[DMAX],costuri[DMAX];
int n,m,k;

int main()
{
citire();
sort(G+1,G+m+1, sortare);
kruskal();
fagrafprim();
DFS(1,0,1,0);
rezolvare();
    return 0;
}

bool sortare(muchie a,muchie b)
{
return a.cost<b.cost;
}

void rezolvare()
{
int i,x,y;
for (i=1;i<=k;i++)
    {
    fscanf(fin,"%d %d",&x,&y);
    fprintf(fout,"%d\n",querry(x,y));
    }
}

void kruskal()
{
int i=0,nrp,minim,maxim,j,nrm=1;
for (i=1;i<=n;i++) conex[i]=i;
i=1;
for (nrp=1;nrp<=n-1;nrp++)
     {for (;i<=m;i++)
          if (conex[ G[i].x ]!=conex[ G[i].y ])
             {
              GAPM[nrm++]=G[i];
              if ( conex[ G[i].x ]>conex[ G[i].y ] )
                 {
                  maxim=conex[ G[i].x ];
                  minim=conex[ G[i].y ];
                 }
                 else
                 {
                  maxim=conex[ G[i].y ];
                  minim=conex[ G[i].x ];
                 }
              for (j=1;j<=n;j++)
                   if (conex[j]==maxim) conex[j]=minim;
             }
     }
}

void fagrafprim()
{
int i,nodparinte,nodfiu,cost;
vecin Vecin;
for (i=1;i<=n-1;i++)
    {
     nodparinte=GAPM[i].x;
     nodfiu=GAPM[i].y;
     cost=GAPM[i].cost;

     Vecin.varf=nodfiu;
     Vecin.cost=cost;
     Gprim[nodparinte].push_back(Vecin);

     Vecin.varf=nodparinte;
     Vecin.cost=cost;
     Gprim[nodfiu].push_back(Vecin);
    }
}

void DFS(int nod,int parinte,int nivel,int cost)
{
int i;
father[nod]=parinte;
level[nod]=nivel;
costuri[nod]=cost;

for (i=0;i<Gprim[nod].size();i++)
     if (level[Gprim[nod][i].varf]==0)
         DFS(Gprim[nod][i].varf,nod,nivel+1,Gprim[nod][i].cost);
}

int querry(int x,int y)
{
int rezultat=0;
if (level[y]<level[x])
    swap(x,y);
while (level[y]!=level[x])
      {
       rezultat=max(rezultat,costuri[y]);
       y=father[y];
      }
while (x!=y)
      {
       rezultat=max(rezultat,max(costuri[x],costuri[y]));
       x=father[x];
       y=father[y];
      }
return rezultat;
}

void citire()
{
int i;
fscanf(fin,"%d %d %d",&n,&m,&k);
for (i=1;i<=m;i++)
    {
    fscanf(fin,"%d %d %d",&G[i].x,&G[i].y,&G[i].cost);
    }
}