Cod sursa(job #1992736)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 21 iunie 2017 11:53:08
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.56 kb
#include <iostream>
#include <fstream>
#define inf 1000010

using namespace std;

ifstream in("coach.in");
ofstream out("coach.out");

long drum[101][101];
int muchie[101][101];
int redenum[101], nume[101], calor[101];
int pctPlec, pctSos, limitInf, limitSup;
int n, m, t;
//t-distanta care trebuie parcursa
//calor- array cu valorile calorice din fiecare intersectie

int parcurgere(int plec){
  int ok = 0;//contor daca valorile din matricea drumurilor sunt mai mari
  // decat t, ca eu fac din ce in ce mai mic si nu are rost sa continui altfel
  for(int i = plec; i<=n ; i++)
    for(int j = plec; j<=n; j++)
      drum[i][j] = muchie[i][j] ? muchie[i][j] : inf;
  //completez matrice drumurilor doar in patratul de jos , ca merg crescator dupa calorii

  for(int prin = plec; prin <= n; prin++){//mergem doar in partatul de jos
    for(int din = plec; din <=n; din++)
      if(drum[din][prin]<=inf){
        for(int la = plec; la <= n; la++)
          if(drum[din][la] > (drum[din][prin] + drum[prin][la]))
            drum[din][la] = drum[din][prin] + drum[prin][la];//calculam drumul minim
      }
    for(int i = plec; i <= prin; i++)//verific valorile drumurilor prin nodul prin
      for(int j = plec; j<= prin; j++){
        if(drum[i][j]==t){//am gasit un drum de cost t => ma opresc
          pctPlec = i;
          pctSos = j;
          limitInf = calor[plec];
          limitSup = calor[prin];
          return 0;
        }

      }
    }
  return 1;
}

void rezolvare(){
  for(int i = 1; i < n; i++)
    if(parcurgere(i) != 1)
      break;//am gasit, ma opresc
}

void citire(){
  in >> n >> m >> t;
  for(int i = 1; i <= n; i++){
    in >> calor[i];
    nume[i] = redenum[i] = i;
  }
  //redenumire noduri crescator dupa caloriile din intersectii
  for(int i = 1; i < n; i++)
    for(int j = i+1; j <= n; j++)
      if(calor[i] > calor[j]){
        int temp = calor[i];
        calor[i] = calor[j];
        calor[j] = temp;
        temp = nume[i]; nume[i] = nume[j]; nume[j] = temp;
        //noduri ordonate crescator dupa calorii
      }
  for(int i = 1; i <= n; i++)
    redenum[nume[i]] = i;
    //nodurile redenumite cu indici de  la 1 la n :
    //ex: nod cu val 2 e cel mai mic , el capata redenumirea de 1, ca e primul;
  for(int i = 1; i <= m; i++){
    int temp1, temp2, temp3;
    in >> temp1 >> temp2 >> temp3;
    muchie[redenum[temp1]][redenum[temp2]] = temp3;
    muchie[redenum[temp2]][redenum[temp1]] = temp3;
  }
}

int main(){
  citire();
  rezolvare();
  //acum afisez dupa numele initial
  out << nume[pctPlec] << ' ' << nume[pctSos] << ' ' << limitInf << ' ' << limitSup;
  return 0;
}