제출 #805727

#제출 시각아이디문제언어결과실행 시간메모리
805727YesPyCheap flights (LMIO18_pigus_skrydziai)C++17
100 / 100
938 ms155684 KiB
#include <bits/stdc++.h>

#define ff first
#define ss second
#define tcT template<class T
#define fastio ios::sync_with_stdio(false);cin.tie(nullptr);
#define ln '\n'
#define nwln cout<<ln;

using namespace std;

tcT> using vr = vector<T>;
using pi = pair<int, int>;
using vi = vr<int>;
using vpi = vr<pi>;
using ll = long long;
using oo = bool;

#define maxs(i, j) (i = max(i, j))
#define fri(i,a,b) for(int i=(a); i<(b); ++i)
#define each(x, a) for(auto& x: a)

#define sz(x) int((x).size())
#define phb push_back
#define eb emplace_back

const int MX = (int) 3e5+3;
ll N, M, ans;
oo used[MX];
set<int> orz[MX];
vpi adj[MX];

inline void dfs(int u) {
	used[u] = true;
	ll res = 0, xam = 0, U = 0, idx = 0;

	map<int, int> cur;

	each(x, adj[u]) {
		cur[x.ff] = idx++;
		res += x.ss;
		if(xam < x.ss) U = x.ff, xam = x.ss;
	}

	maxs(ans, res);
	// idk if this "if" is necessary
	if(!used[U]) {
		each(x, adj[U]) {
			if(!orz[u].count(x.ff)) continue;
			
			if(cur[x.ff] >= sz(adj[u])) {
				cout<<"why?"<<ln;
				exit(0);
			}

			maxs(ans, xam + x.ss + adj[u][cur[x.ff]].ss);
		}
	}

	each(x, adj[u]) {
		if(!used[x.ff]) dfs(x.ff);
	}
}

int main()
{
	fastio
	cin>>N>>M;

	while(M--) {
		int u, v, w;
		cin>>u>>v>>w;
		adj[u].eb(v, w);
		adj[v].eb(u, w);
		orz[u].insert(v);
		orz[v].insert(u);
	}

	fri(i,1,N+1) {
		if(used[i]) continue;
		dfs(i);
	}

	cout<<ans<<ln;

	return 0;
}

/*
Wow, beautiful trick
Two possible types: star or triangle
Stars are easy, bottleneck are the triangles

What I do is, if I'm on node v then between all its edges I choose the
greatest one and try to match the rest... it can be proved it's correct

Suppose the answer is not correct and let the max-weight triangle be
p, q -> a
q, r -> b
r, p -> c

Then, we're assuming there exists
p, P -> greater than c, a but less than b
q, Q -> greater than a, b but less than c
r, R -> greater than b, c but less than a

Contradiction! We're done :D
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...