Submission #106850

#TimeUsernameProblemLanguageResultExecution timeMemory
106850amitimeismoney (balkan11_timeismoney)C++17
100 / 100
358 ms1088 KiB
#include <bits/stdc++.h>
#define sz(c)      int(c.size())
#define rep(i,a,b) for (int i=a; i<(b); ++i)
#define per(i,a,b) for (int i=(b)-1; i>=(a); --i)
using namespace std;
using ll = long long;

template<int N>
struct disjoint_sets {
	int r[N];
	disjoint_sets() {
		memset(r,~0,sizeof(r));
	}
	void reset(int n) {
		rep(i,0,n) r[i]=-1;
	}
	int get(int x) {
		return r[x]<0 ? x : r[x]=get(r[x]);
	}
	int size(int x) {
		return -r[get(x)];
	}
	bool join(int x,int y) {
		x=get(x);
		y=get(y);
		if (x==y) return false;
		if (r[x]>r[y]) swap(x,y);
		r[x]+=r[y];
		r[y]=x;
		return true;
	}
};

struct edge_t {
	int x,y,t,c;
	ll w;
};

ll const INF=ll(1e18);
int const MAXN=220;
int const MAXM=11000;
int N,M;
vector<edge_t> E;
disjoint_sets<MAXN> DS;
vector<pair<int,int>> res;

pair<ll,ll> test(ll x,ll y,bool out=false) {
	for (auto &e:E) {
		e.w=e.t*x + e.c*y;
	}
	
	sort(E.begin(),E.end(),[](const edge_t &a, const edge_t &b) {
		return a.w < b.w;
	});
	
	DS.reset(N);
	
	int cc=N;
	ll st=0,sc=0;
	for (auto e:E) if (DS.join(e.x,e.y)) {
		st+=e.t;
		sc+=e.c;
		if (out) res.emplace_back(e.x,e.y);
		cc--;
		if (cc==1) break;
	}
	
	return {st,sc};
}

int main() {
	cin.tie(0);
	ios_base::sync_with_stdio(0);
	cout<<fixed<<setprecision(10);

	cin>>N>>M;
	rep(i,0,M) {
		int x,y,t,c;
		cin>>x>>y>>t>>c;
		E.push_back({x,y,t,c,0});
	}
	
	int const MAXX=1000;
	ll best=INF;
	int bestx=-1;
	rep(x,0,MAXX+1) {
		ll st,sc;
		tie(st,sc)=test(x,MAXX-x);
		if (best>st*sc) {
			best=st*sc;
			bestx=x;
		}
	}
	
	ll st,sc;
	tie(st,sc)=test(bestx,MAXX-bestx,true);
	
	cout<<st<<" "<<sc<<"\n";
	for (auto p:res) cout<<p.first<<" "<<p.second<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...