// ^^
// <{:3
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,popcnt,tune=native")
//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define int long signed long int
#define ld long double
using namespace std;
const int maxn = 202;
vector<tuple<ld, ld, int, int>> edges; // c t x y
pair<int, ld> ans; // val, k
map<pair<int, int>, bool> vis;
int p[maxn];
int n, m;
inline void rt() { for(int i = 0; i <= n; ++i) p[i] = i; }
int f(int x)
{
if(p[x] == x) return x;
return p[x] = f(p[x]);
}
inline void u(int x, int y)
{
x = f(x); y = f(y);
if(x == y) return;
p[x] = y;
}
pair<int, int> mst(ld k)
{
vector<tuple<ld, ld, ld, int, int>> v;
rt();
for(auto [c, t, x, y] : edges) v.emplace_back(t+k*c, c, t, x, y);
sort(v.begin(), v.end());
pair<int, int> ret(0, 0);
for(auto [val, c, t, x, y] : v)
{
if(f(x) != f(y))
{
ret.first += c;
ret.second += t;
u(x, y);
}
}
return ret;
}
void rec(ld x1, ld y1, ld x2, ld y2)
{
if(x1 == x2) return;
ld k = (y1 - y2) / (x1 - x2);
ld c = y1 - (k * x1);
pair<int, int> novi = mst(-k);
if(vis[novi]) return;
vis[novi] = 1;
ld y = (k*novi.first) + c;
if(novi.second >= y) return;
if(novi.first * novi.second < ans.first)
{
ans.first = novi.first * novi.second;
ans.second = k;
}
rec(x1, y1, novi.first, novi.second);
rec(x2, y2, novi.first, novi.second);
}
signed main()
{
cin.tie(NULL)->sync_with_stdio(false);
ans = {1e9, 0};
cin >> n >> m;
for(int i = 0; i < m; ++i)
{
ld t, c;
int x, y;
cin >> x >> y >> t >> c;
edges.emplace_back(t, c, x, y);
}
rt();
vector<pair<int, int>> minte, mince;
sort(edges.begin(), edges.end());
pair<int, int> mint(0, 0);
for(auto &[t, c, x, y] : edges)
{
int xtr = f(x), ytr = f(y);
if(xtr != ytr)
{
mint.first += c;
mint.second += t;
minte.emplace_back(x, y);
u(xtr, ytr);
}
swap(t, c);
}
rt();
sort(edges.begin(), edges.end());
pair<int, int> minc(0, 0);
for(auto &[c, t, x, y] : edges)
{
int xtr = f(x), ytr = f(y);
if(xtr != ytr)
{
minc.first += c;
minc.second += t;
mince.emplace_back(x, y);
u(xtr, ytr);
}
}
rec(minc.first, minc.second, mint.first, mint.second);
if(minc.first * minc.second < ans.first)
{
swap(minc.first, minc.second);
cout << minc.first << " " << minc.second << "\n";
for(auto [x, y] : mince) cout << x << " " << y << "\n";
return 0;
}
if(mint.first * mint.second < ans.first)
{
swap(mint.first, mint.second);
cout << mint.first << " " << mint.second << "\n";
for(auto [x, y] : minte) cout << x << " " << y << "\n";
return 0;
}
rt();
ld k = -ans.second;
vector<tuple<ld, ld, ld, int, int>> v;
for(auto [c, t, x, y] : edges) v.emplace_back(t+k*c, c, t, x, y);
sort(v.begin(), v.end());
pair<int, int> ret(0, 0);
vector<pair<int, int>> ansedge;
for(auto [val, c, t, x, y] : v)
{
if(f(x) != f(y))
{
ret.first += c;
ret.second += t;
u(x, y);
ansedge.emplace_back(x, y);
}
}
swap(ret.first, ret.second);
cout << ret.first << " " << ret.second << "\n";
for(auto [x, y] : ansedge) cout << x << " " << y << "\n";
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Correct |
1 ms |
344 KB |
Output is correct |
7 |
Correct |
1 ms |
604 KB |
Output is correct |
8 |
Correct |
6 ms |
1304 KB |
Output is correct |
9 |
Correct |
0 ms |
348 KB |
Output is correct |
10 |
Correct |
0 ms |
348 KB |
Output is correct |
11 |
Correct |
0 ms |
348 KB |
Output is correct |
12 |
Correct |
1 ms |
344 KB |
Output is correct |
13 |
Correct |
1 ms |
600 KB |
Output is correct |
14 |
Correct |
10 ms |
564 KB |
Output is correct |
15 |
Correct |
8 ms |
348 KB |
Output is correct |
16 |
Correct |
187 ms |
1508 KB |
Output is correct |
17 |
Correct |
192 ms |
856 KB |
Output is correct |
18 |
Correct |
193 ms |
860 KB |
Output is correct |
19 |
Correct |
1925 ms |
2920 KB |
Output is correct |
20 |
Correct |
1923 ms |
2708 KB |
Output is correct |