Cod sursa(job #298545)

Utilizator alecmanAchim Ioan Alexandru alecman Data 6 aprilie 2009 10:54:03
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<cstdio>
#include<vector>

using namespace std;

#define INPUT "pscnv.in"
#define OUTPUT "pscnv.out"
#define VP vector< pair< long, long > >
#define pb push_back
#define mp make_pair

const long NMAX = 250001;
const int KMAX = 1000;

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

long N, M, X, Y;
VP Cost[ NMAX ];
long Deg[ NMAX ];

void readData()
{
  long Node1, Node2, Ct;
	
  fscanf(fin, "%ld %ld %ld %ld", &N, &M, &X, &Y);
  
  for(long i = 1; i <= M; ++i)
  {
    fscanf(fin, "%ld %ld %ld", &Node1, &Node2, &Ct);
    
    Cost[ Ct ].pb(mp(Node1, Node2));
  }
}

int root(long Node)
{
  if(Deg[ Node ] == Node) return Node;
  Deg[ Node ] = root(Deg[ Node ]);
  return Deg[ Node ];
}

void combine(long Node1, long Node2)
{
  Deg[ root( Node1 ) ] = root(Node2);
}

void solve()
{
  VP::iterator it;
  
  for(long i = 1; i <= N; ++i) Deg[ i ] = i;
	
  for(int i = 1; i <= KMAX; ++i)
  {
    for(it = Cost[ i ].begin(); it != Cost[ i ].end(); ++it)
      if(root((*it).first) != root((*it).second)) combine((*it).first, (*it).second);
      
    if(root(X) == root(Y)){
      fprintf(fout, "%d\n", i);
      break;
    }
  }
}

int main()
{
  readData();
  
  solve();
	
  fclose(fin);
  fclose(fout);
  
  return 0;
}