Submission #373517

#TimeUsernameProblemLanguageResultExecution timeMemory
373517MatheusLealVtimeismoney (balkan11_timeismoney)C++17
85 / 100
2089 ms3156 KiB
#include <bits/stdc++.h> #define N 210 #define f first #define s second #define pb push_back #define mp make_pair #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() using namespace std; #define int long long typedef pair<int, int> pii; int n, m; vector<pair<int, pii> > grafo[N]; int pai[N], peso[N]; int Find(int x){ if(x == pai[x]) return x; return pai[x] = Find(pai[x]); } bool join(int a, int b){ a = Find(a); b = Find(b); if(a==b) return 0; if(peso[a]<peso[b])swap(a,b); pai[b]=a; if(peso[a]==peso[b])peso[a]++; return 1; } vector< pii > good, curr; pair<int,pii> get(int A, int B){ // cout<<"sss "<<A<<" "<<B<<"\n"; vector< vector<int> > arestas; curr.clear(); for(int i = 1; i <= n; i++){ pai[i]=i,peso[i] = 0; for(auto v: grafo[i]){ int cost = A*v.s.f + B*v.s.s; arestas.pb({cost, v.s.f, v.s.s, i, v.f}); } } int x = 0, y = 0, resp=0; sort(all(arestas)); for(auto e: arestas){ int cost = e[0], xi = e[1], yi = e[2], a = e[3], b = e[4]; if(join(a, b)){ curr.pb({a, b}); x += xi; y += yi; resp += cost; } } return mp(resp, pii(x, y)); } int cross(pii A, pii B, pii C){ return (A.f - C.f)*(B.s - C.s) - (A.s - C.s)*(B.f - C.f); } auto ans = mp((int)(2e18),pii(-1,-1)); void solve(pii L, pii R){ pii slope = {(L.s - R.s), (R.f - L.f)}; auto closest = get(slope.f, slope.s); if(closest.s.f * closest.s.s < ans.f){ ans.f = closest.s.f*closest.s.s; ans.s = closest.s; good=curr; } if(cross(L, R, closest.s) == 0) return; solve(L, closest.s),solve(closest.s, R); } int32_t main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m; for(int i = 1; i <= m; i++){ int a, b,c,d; cin>>a>>b>>c>>d; a++,b++; grafo[a].push_back({b, {c, d}}); grafo[b].push_back({a, {c, d}}); } auto R = get(0, 1), L = get(1, 0); solve(L.s, R.s); cout<<ans.s.f<<" "<<ans.s.s<<"\n"; for(auto e: good){ cout<<e.f-1<<" "<<e.s-1<<"\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...