Cod sursa(job #595354)

Utilizator Smaug-Andrei C. Smaug- Data 12 iunie 2011 03:57:51
Problema Radiatie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <utility>
using namespace std;

#define MAXN 15010
#define MAXM 30010

int C[MAXM];

inline int find(int *T, int x){

  while(x!=T[x])
    x=T[x];

  return x;
}

inline void unite(int *T, int x, int y){
  T[x]=y;
}

int cmp(int a, int b){
  return C[a]<C[b];
}

int main(){

  freopen("radiatie.in", "r", stdin);
  freopen("radiatie.out", "w", stdout);

  int N, M, K, i, j, a, b, cq, nq, found;
  static int X[MAXM], Y[MAXM], IND[MAXM], B[MAXN], E[MAXN], T[MAXM], use[MAXN], min[MAXN];
  vector< pair<int,int> > G[MAXN];
  vector< pair<int,int> >::iterator ij;
  vector<int> Q[2];
  vector<int>::iterator  ii;

  scanf("%d%d%d", &N, &M, &K);
  for(i=1; i<=M; i++)
    scanf("%d%d%d", X+i, Y+i, C+i);

  for(i=1; i<=K; i++)
    scanf("%d%d", B+i, E+i);

  for(i=1; i<=M; i++){
    T[i]=i;
    IND[i]=i;
  }

  sort(IND+1, IND+M+1, cmp);

  for(i=1; i<=M; i++)
    if((a=find(T, X[IND[i]])) != (b=find(T, Y[IND[i]]))){
      unite(T, a, b);
      G[X[IND[i]]].push_back(make_pair(Y[IND[i]], C[IND[i]]));
      G[Y[IND[i]]].push_back(make_pair(X[IND[i]], C[IND[i]]));
    }
      
  for(i=1; i<=K; i++){
    Q[0].clear();
    Q[1].clear();
    cq=0; Q[cq].push_back(B[i]);
    memset(use, 0, sizeof(use));
    use[B[i]]=1;
    for(j=1; j<=N; j++)
      min[j]=0;
    found=0;

    while(!Q[cq].empty()){
      nq=1-cq;
      for(ii = Q[cq].begin(); ii != Q[cq].end(); ii++){
	if(*ii == E[i]){
	  found=1;
	  break;
	}

	for(ij = G[*ii].begin(); ij != G[*ii].end(); ij++)
	  if(!use[ij->first]){
	    use[ij->first]=1;
	    Q[nq].push_back(ij->first);
	    if(min[*ii] < ij->second)
	      min[ij->first]=ij->second;
	    else
	      min[ij->first]=min[*ii];
	  }
	  
      }
      
      if(found)
	break;
      
      Q[cq].clear();
      cq=nq;
    }

    printf("%d\n", min[E[i]]);

  }  

  return 0;

}