54992023-07-01 19:58:04AndrosVillanyautĂłcpp11Wrong answer 23/6068ms6876 KiB
#include<algorithm>
#include <iostream>
#define maxN 301
#define Infi 10000000000


int varosszam, utszam, max_toltes;
long long T[maxN][maxN];
long long akku_graf[maxN][maxN];
long long T2[maxN][maxN];
long long X[maxN][maxN];


using namespace std;

void debug(long long A[maxN][maxN]) {
	for (int i = 1; i <= varosszam; i++)
	{
		for (int j = i + 1; j <= varosszam; j++)
		{
			//if (A[j][i] != A[i][j])cout << "SZIMETRIAVESZTESEG";
			cout << i << ", " << j << "\t" << A[i][j];
			cout << endl;
		}
	}
}

//Bekér két gráfot
//A-t módosítja
//					töltés					T2
void Szor(long long A[maxN][maxN], long long B[maxN][maxN]) {
	//X egy új gráf lesz
	for (int i = 1; i <= varosszam; i++)
		for (int j = 1; j <= varosszam; j++) {
			//Minden párra
			X[i][j] = Infi;

			//Ha i-ből j-be szeretnénk eljutni,
			//úgy, hogy közben tölthetünk egyszer
			//TALÁN
			for (int u = 1; u <= varosszam; u++)
				X[i][j] = min(X[i][j], max(A[i][u], B[u][j]));
		}

	//Átírja A-t X értékeire
	for (int i = 1; i <= varosszam; i++)
		for (int j = 1; j <= varosszam; j++) {
			A[i][j] = X[i][j];
		}
}

int main() {
	//Cin tie null
	int kezdo, veg;
	long long a = 0, b, hossz;
	cin >> varosszam >> utszam >> max_toltes;

	//Felvesz valami gráfot.
	//Minden éle végtelen, kivéve ha önmagába visz
	//Akkor 0
	//1-től indexel!
	for (int i = 1; i <= varosszam; i++) {
		T[i][i] = 0;
		for (int j = i + 1; j <= varosszam; j++) {
			T[j][i] = Infi;
			T[i][j] = Infi;
		}
	}

	//Az előzőleg felvett gráfnál beállítja az élek hosszát
	for (int i = 0; i < utszam; i++) {
		cin >> kezdo >> veg >> hossz;
		T[kezdo][veg] = hossz;
		T[veg][kezdo] = hossz;
	}

	//cout << "Sima beolvasas";
	//debug(T);
	//cout << endl << endl;


	//Máténak igaza volt valszeg, ez minimális utat keres
	//Minden élre megnézi, hogy lehet-e javítani egy köztes node-al
	for (int koztes_node = 1; koztes_node <= varosszam; koztes_node++)
		for (int i = 1; i <= varosszam; i++)
			for (int j = 1; j <= varosszam; j++)
				//Minden számhármason. Ez nagyon lassúnak tűnik
				T[i][j] = min(T[i][j], T[i][koztes_node] + T[koztes_node][j]);

	//debug(T);

	//T2 másolata T-nek
	for (int i = 1; i <= varosszam; i++) {
		//Önmagába 0
		akku_graf[i][i] = 0;
		T2[i][i] = 0;

		for (int j = i + 1; j <= varosszam; j++) {
			T2[i][j] = T[i][j];
			T2[j][i] = T[i][j];
			//Átmásolja a T-t
			akku_graf[i][j] = Infi;
			akku_graf[j][i] = Infi;
			//E-t meg felveszi végtelen élekkel
		}
	}

	//while (max_toltes > 0) {

	//	if (max_toltes % 2 == 1) {
	//		Szor(akku_graf, T2);
	//	}


	//	Szor(T2, T2);

	//	max_toltes /= 2;
	//}

	for (int i = 0; i < max_toltes - 1; i++)
	{
		Szor(T2, T2);
	}

	for (int i = 1; i <= varosszam; i++)
		for (int j = 1; j <= varosszam; j++) {
			akku_graf[i][j] = T2[i][j];
		}

	//Maximális szükséges kapacitás kiválasztása
	for (int i = 1; i <= varosszam; i++)
		for (int j = i + 1; j <= varosszam; j++)
			a = max(a, akku_graf[i][j]);

	cout << a << "\n";
	return 0;
}
SubtaskSumTestVerdictTimeMemory
base23/60
1Accepted0/03ms1920 KiB
2Accepted0/028ms3520 KiB
3Accepted1/13ms3024 KiB
4Accepted1/13ms2984 KiB
5Accepted1/14ms3240 KiB
6Accepted2/24ms4240 KiB
7Accepted2/26ms4452 KiB
8Accepted2/27ms4624 KiB
9Accepted1/14ms4076 KiB
10Wrong answer0/16ms4072 KiB
11Wrong answer0/16ms4348 KiB
12Wrong answer0/214ms5532 KiB
13Wrong answer0/228ms5748 KiB
14Wrong answer0/221ms5832 KiB
15Accepted3/310ms6060 KiB
16Wrong answer0/317ms6104 KiB
17Wrong answer0/24ms5020 KiB
18Wrong answer0/26ms5020 KiB
19Wrong answer0/28ms5276 KiB
20Wrong answer0/24ms5232 KiB
21Accepted2/24ms5172 KiB
22Accepted2/24ms5232 KiB
23Wrong answer0/327ms6480 KiB
24Wrong answer0/332ms6516 KiB
25Wrong answer0/368ms6744 KiB
26Wrong answer0/346ms6876 KiB
27Accepted3/337ms6608 KiB
28Wrong answer0/320ms6648 KiB
29Wrong answer0/316ms6584 KiB
30Accepted3/343ms6572 KiB