제출 #580734

#제출 시각아이디문제언어결과실행 시간메모리
580734Lobo시간이 돈 (balkan11_timeismoney)C++17
35 / 100
2098 ms1276 KiB
#include<bits/stdc++.h>
using namespace std;

const long long inf = (long long) 1e18 + 10;
const int inf1 = (int) 1e9 + 10;
// #define int long long
#define dbl double
#define endl '\n'
#define sc second
#define fr first
#define mp make_pair
#define pb push_back
#define all(x) x.begin(), x.end()

const int maxn = 220;

int n, m, ds[maxn], dsz[maxn], mark[maxn];
pair<dbl,int> d[maxn];
vector<int> g[maxn];
pair<int,pair<int,int>> ans;
vector<pair<pair<int,int>,pair<int,int>>> edg;
vector<pair<int,int>> ansv;

int find(int u) {
    if(u == ds[u]) return u;
    return ds[u] = find(ds[u]);
}

void join(int u, int v) {
    if(dsz[u] < dsz[v]) swap(u,v);
    dsz[u]+= dsz[v];
    ds[v] = u;
}

pair<int,int> mst(dbl c1, dbl t1) {
    // priority_queue<pair<dbl,int>, vector<pair<dbl,int>>, greater<pair<dbl,int>>> pq;
    
    for(int i = 1; i <= n; i++) {
        d[i] = mp(inf1,0);
        mark[i] = 0;
        ds[i] = i;
        dsz[i] = 1;
    }

    mark[1] = 1;
    for(auto id : g[1]) {
        int v = edg[id].fr.fr^edg[id].fr.sc^1;
        int c = edg[id].sc.fr;
        int t = edg[id].sc.sc;
        d[v] = min(d[v],mp(c*c1+t*t1,id));
    }

    int C = 0;
    int T = 0;
    vector<pair<int,int>> curv;
    while((int) curv.size() != n-1) {
        pair<dbl,int> cur = mp(inf1,0);
        for(int i = 1; i <= n; i++) {
            if(mark[i]) continue;
            cur = min(cur,d[i]);
        }

        int id = cur.sc;
        int u = edg[id].fr.fr;
        int v = edg[id].fr.sc;
        int v1;
        if(mark[u]) v1 = v;
        else v1 = u;
        u = find(u);
        v = find(v);
        int c = edg[id].sc.fr;
        int t = edg[id].sc.sc;

        if(u != v) {
            join(u,v);
            curv.pb(mp(edg[id].fr.fr,edg[id].fr.sc));
            C+= c;
            T+= t;

            mark[v1] = 1;
            for(auto id1 : g[v1]) {
                int v2 = edg[id1].fr.fr^edg[id1].fr.sc^v1;
                int c2 = edg[id1].sc.fr;
                int t2 = edg[id1].sc.sc;
                d[v2] = min(d[v2],mp(c2*c1+t2*t1,id1));
            }
        }
    }

    if(ans.fr > C*T) {
        ans.fr = C*T;
        ans.sc = mp(C,T);
        swap(ansv,curv);
    }
    // cout << " " << c1 << " " << t1 << " " << C << " " << T << endl;
    return mp(C,T);
}

void dec(int cl, int tl, int cr, int tr) {
    // cout << cl << " " << tl << " " << cr << " " << tr << endl;
    int dc = cr-cl; // > 0
    int dt = tr-tl; // < 0
    dbl sz = sqrt(dc*dc + dt*dt);
    auto aux = mst(dt/sz,-dc/sz);
    int c = aux.fr;
    int t = aux.sc;
    if(c == cl || c == cr) return;
    dec(cl,tl,c,t);
    dec(c,t,cr,tr);
}

void solve() {
    cin >> n >> m;

    for(int i = 0; i < m; i++) {
        int u,v,c,t; cin >> u >> v >> c >> t;
        u++;
        v++;
        edg.pb(mp(mp(u,v),mp(c,t)));
        g[u].pb(i);
        g[v].pb(i);
    }

    ans.fr = inf1;
    pair<int,int> aux;
    aux = mst(0,1);
    int c0 = aux.fr;
    int t0 = aux.sc;
    aux = mst(1,0);
    int c1 = aux.fr;
    int t1 = aux.sc;
    dec(c0,t0,c1,t1);

    cout << ans.sc.fr << " " << ans.sc.sc << endl;
    for(auto x : ansv) {
        cout << x.fr-1 << " " << x.sc-1 << endl;
    }
}

int32_t main() {
    ios::sync_with_stdio(false); cin.tie(0);

    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int tt = 1;
    // cin >> tt;
    while(tt--) {
        solve();
    }

}
#Verdict Execution timeMemoryGrader output
Fetching results...