#include #include using namespace std; struct hrana { // hrana int to, v; // cílový vrchol a délka hrany }; struct vrchol { // mezivýsledky pro jeden vrchol // do P[c] si zapamatujeme dvojice tras z vrcholu P[c].a do c int a; int b, abc; // nejlepší dvojice tras int d, adc; // druhá nejlepší vrchol() { b = abc = d = adc = -1000; } }; vrchol P[100000]; int main(){ FILE *f = fopen("swiss.in", "r"), *fo = fopen("swiss.out", "w"); int m, n; vector > G; fscanf(f, "%i %i", &n, &m); n++; // načteme vstup for (int i = 0; i < n; i++) G.push_back(vector ()); for (int i = 0; i < m; i++) { int from, to, val; fscanf(f, "%i%i%i", &from, &to, &val); hrana e; e.v = val; e.to = from; G[to].push_back(e); e.to = to; G[from].push_back(e); } int besta, bestb, bestc, bestd, bestsum=-1; for (int a = 0; a < n; a++) { int b, c, ab, bc; for (int j = 0; j < G[a].size(); j++) { b = G[a][j].to; ab = G[a][j].v; for (int k = 0; k < G[b].size(); k++) { c = G[b][k].to; bc = G[b][k].v; if (a == c) continue; if (a != P[c].a) { P[c] = vrchol(); P[c].a = a; } if (ab+bc > P[c].abc) { P[c].adc = P[c].abc; P[c].d = P[c].b; P[c].abc = ab+bc; P[c].b = b; } else if (ab+bc > P[c].adc) { P[c].adc = ab+bc; P[c].d = b; } if (P[c].abc+P[c].adc > bestsum) { bestsum = P[c].abc + P[c].adc; besta = a; bestb = P[c].b; bestc = c; bestd = P[c].d; } } } } if (bestsum < 0) fprintf(fo, "NEEXISTUJE\n"); else fprintf(fo, "%d\n%d %d %d %d %d\n", bestsum, besta, bestb, bestc, bestd, besta); fclose(fo); return 0; }