Pagini recente » Cod sursa (job #1042620) | Cod sursa (job #1936343) | Cod sursa (job #2400421) | Cod sursa (job #582613) | Cod sursa (job #1992736)
#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;
}