Task: | Densest subgraph |
Sender: | Pohjantahti |
Submission time: | 2018-09-18 18:22:48 +0300 |
Language: | C++ |
Status: | READY |
Result: | ACCEPTED |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.02 s | details |
#2 | ACCEPTED | 0.03 s | details |
#3 | ACCEPTED | 0.07 s | details |
#4 | ACCEPTED | 0.12 s | details |
#5 | ACCEPTED | 0.16 s | details |
#6 | ACCEPTED | 0.19 s | details |
#7 | ACCEPTED | 0.02 s | details |
#8 | ACCEPTED | 0.02 s | details |
#9 | ACCEPTED | 0.04 s | details |
#10 | ACCEPTED | 0.04 s | details |
#11 | ACCEPTED | 0.03 s | details |
#12 | ACCEPTED | 0.02 s | details |
#13 | ACCEPTED | 0.01 s | details |
#14 | ACCEPTED | 0.02 s | details |
#15 | ACCEPTED | 0.02 s | details |
#16 | ACCEPTED | 0.02 s | details |
#17 | ACCEPTED | 0.03 s | details |
#18 | ACCEPTED | 0.03 s | details |
#19 | ACCEPTED | 0.01 s | details |
#20 | ACCEPTED | 0.02 s | details |
#21 | ACCEPTED | 0.03 s | details |
#22 | ACCEPTED | 0.02 s | details |
#23 | ACCEPTED | 0.03 s | details |
#24 | ACCEPTED | 0.01 s | details |
Compiler report
input/code.cpp: In function 'bool flow_ok(ld)': input/code.cpp:80:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for (int i = 0; i < cp.size()-1; ++i) { ~~^~~~~~~~~~~~~
Code
#include <iostream> #include <vector> #include <algorithm> using namespace std; typedef long long ll; typedef long double ld; const int N = 100; const int S = 0; const int T = N+1; int n, m; vector<int> g[N+5]; ll d[N+5][N+5]; int v[N+5]; int gvis = 0; vector<int> cp; bool rvis[N+5]; vector<int> res; void set_weights(ld gp) { const ll MP = 1000000000; ll ig = (ll)(gp*MP); for (int a : g[S]) { d[S][a] = m*MP; d[a][S] = 0; } for (int a : g[T]) { d[a][T] = m*MP + 2*ig - (g[a].size()-2)*MP; d[T][a] = 0; } for (int i = 1; i <= n; ++i) { for (int a : g[i]) { if (a == S || a == T) continue; d[i][a] = 1*MP; } } } ll dfs(int s, int t, ll th, int cvis, ll cmin) { if (v[s] == cvis) return -1; v[s] = cvis; cp.push_back(s); if (s == t) return cmin; for (int a : g[s]) { if (d[s][a] < th) continue; ll cres = dfs(a, t, th, cvis, min(cmin, d[s][a])); if (cres != -1) return cres; } cp.pop_back(); return -1; } void get_res(int s) { if (rvis[s]) return; rvis[s] = true; if (!(s == S || s == T)) { res.push_back(s); } for (int a : g[s]) { if (d[s][a] == 0) continue; get_res(a); } } bool flow_ok(ld gp) { set_weights(gp); ll cth = (1LL<<60); while (true) { gvis++; cp.clear(); ll minw = dfs(S, T, cth, gvis, 1000000000000000005); if (minw != -1) { for (int i = 0; i < cp.size()-1; ++i) { int fn = cp[i]; int sn = cp[i+1]; d[fn][sn] -= minw; d[sn][fn] += minw; } } else { if (cth == 1) break; cth /= 2; } } for (int a : g[S]) { if (d[S][a] > 0) { return true; } } return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> m; for (int i = 0; i < m; ++i) { int a, b; cin >> a >> b; g[a].push_back(b); g[b].push_back(a); } for (int i = 1; i <= n; ++i) { g[S].push_back(i); g[i].push_back(S); g[i].push_back(T); g[T].push_back(i); } ld gp = 0; ld jp = (1LL<<30); for (int i = 0; i < 100; ++i) { if (flow_ok(gp+jp)) gp += jp; jp /= 2; } flow_ok(gp); // build densest subgraph get_res(S); // find densest subgraph int rn = 0, rm = 0; for (int i = 1; i <= n; ++i) { if (rvis[i]) { rn++; for (int a : g[i]) { if (!rvis[a] || a == S || a == T) continue; rm++; } } } rm /= 2; cout << rn << " " << rm << "\n"; for (int a : res) { cout << a << " "; } cout << "\n"; return 0; }
Test details
Test 1
Verdict: ACCEPTED
input |
---|
8 11 1 2 2 3 3 4 4 5 ... |
correct output |
---|
7 10 2 3 4 5 6 7 8 |
user output |
---|
7 10 5 4 3 2 8 6 7 |
Test 2
Verdict: ACCEPTED
input |
---|
100 100 1 97 2 14 2 81 3 34 ... |
correct output |
---|
28 37 3 6 7 9 10 12 15 21 23 27 28 3... |
user output |
---|
28 37 47 23 54 21 94 7 6 92 28 15 98... |
Test 3
Verdict: ACCEPTED
input |
---|
100 200 1 99 2 11 2 28 2 59 ... |
correct output |
---|
71 156 2 3 4 6 7 9 10 11 14 15 16 18 ... |
user output |
---|
71 156 87 16 14 4 20 15 9 28 2 11 21 ... Truncated |
Test 4
Verdict: ACCEPTED
input |
---|
100 300 1 24 1 38 1 65 1 83 ... |
correct output |
---|
93 284 1 2 3 5 6 7 8 9 10 11 12 13 14... |
user output |
---|
93 284 100 52 29 18 20 30 12 6 16 9 5... Truncated |
Test 5
Verdict: ACCEPTED
input |
---|
100 400 1 44 1 56 1 77 1 87 ... |
correct output |
---|
91 368 1 2 3 4 5 6 8 9 10 11 12 13 14... |
user output |
---|
91 368 95 28 10 33 4 2 15 3 26 18 20 ... Truncated |
Test 6
Verdict: ACCEPTED
input |
---|
100 500 1 19 1 40 1 51 1 66 ... |
correct output |
---|
92 465 1 2 4 5 6 7 8 9 10 11 12 13 14... |
user output |
---|
92 465 96 26 6 8 24 16 11 20 10 4 2 7... Truncated |
Test 7
Verdict: ACCEPTED
input |
---|
32 496 1 2 1 3 1 4 1 5 ... |
correct output |
---|
32 496 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
user output |
---|
32 496 1 2 3 4 5 6 7 8 9 10 11 12 13 ... Truncated |
Test 8
Verdict: ACCEPTED
input |
---|
44 462 1 2 1 3 1 4 1 5 ... |
correct output |
---|
44 462 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
user output |
---|
44 462 1 2 3 4 5 6 7 8 9 10 11 12 13 ... Truncated |
Test 9
Verdict: ACCEPTED
input |
---|
56 495 1 2 1 3 1 4 1 5 ... |
correct output |
---|
38 342 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
user output |
---|
38 342 1 2 3 4 5 6 7 8 9 10 11 12 13 ... Truncated |
Test 10
Verdict: ACCEPTED
input |
---|
32 495 1 2 1 3 1 4 1 5 ... |
correct output |
---|
32 495 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
user output |
---|
32 495 16 1 3 2 4 6 5 7 9 8 10 12 11 ... Truncated |
Test 11
Verdict: ACCEPTED
input |
---|
44 461 1 2 1 3 1 4 1 5 ... |
correct output |
---|
22 231 23 24 25 26 27 28 29 30 31 32 ... |
user output |
---|
22 231 23 24 25 26 27 28 29 30 31 32 ... |
Test 12
Verdict: ACCEPTED
input |
---|
56 494 1 2 1 3 1 4 1 5 ... |
correct output |
---|
19 171 20 21 22 23 24 25 26 27 28 29 ... |
user output |
---|
19 171 20 21 22 23 24 25 26 27 28 29 ... |
Test 13
Verdict: ACCEPTED
input |
---|
20 1 5 18 |
correct output |
---|
2 1 5 18 |
user output |
---|
2 1 5 18 |
Test 14
Verdict: ACCEPTED
input |
---|
20 10 2 15 2 16 4 16 5 10 ... |
correct output |
---|
10 9 2 4 5 7 8 10 12 15 16 19 |
user output |
---|
10 9 2 15 8 19 12 16 4 5 10 7 |
Test 15
Verdict: ACCEPTED
input |
---|
20 20 1 13 1 14 1 15 1 19 ... |
correct output |
---|
9 13 1 4 11 12 13 14 15 19 20 |
user output |
---|
9 13 20 12 4 11 14 1 13 19 15 |
Test 16
Verdict: ACCEPTED
input |
---|
20 50 1 3 1 19 2 13 2 14 ... |
correct output |
---|
17 44 2 3 4 5 6 8 9 10 11 12 13 14 1... |
user output |
---|
17 44 20 2 14 3 4 8 5 10 19 11 9 16 ... |
Test 17
Verdict: ACCEPTED
input |
---|
20 100 1 2 1 6 1 7 1 8 ... |
correct output |
---|
19 96 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
user output |
---|
19 96 19 1 2 3 7 5 6 10 9 11 8 4 12 ... |
Test 18
Verdict: ACCEPTED
input |
---|
20 190 1 2 1 3 1 4 1 5 ... |
correct output |
---|
20 190 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
user output |
---|
20 190 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
Test 19
Verdict: ACCEPTED
input |
---|
20 90 1 2 1 3 1 4 1 5 ... |
correct output |
---|
10 45 1 2 3 4 5 6 7 8 9 10 |
user output |
---|
20 90 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
Test 20
Verdict: ACCEPTED
input |
---|
20 50 1 2 1 4 1 6 1 7 ... |
correct output |
---|
10 28 1 2 3 4 5 6 7 8 9 10 |
user output |
---|
10 28 2 1 4 3 5 6 8 9 10 7 |
Test 21
Verdict: ACCEPTED
input |
---|
20 20 1 9 2 6 2 7 2 9 ... |
correct output |
---|
7 10 2 4 6 7 8 9 10 |
user output |
---|
7 10 10 4 8 7 2 6 9 |
Test 22
Verdict: ACCEPTED
input |
---|
20 10 2 7 4 10 5 7 12 19 ... |
correct output |
---|
5 4 12 13 14 15 19 |
user output |
---|
5 4 19 12 13 14 15 |
Test 23
Verdict: ACCEPTED
input |
---|
20 10 8 11 8 13 9 11 10 11 ... |
correct output |
---|
3 3 10 11 12 |
user output |
---|
6 6 8 11 9 10 12 13 |
Test 24
Verdict: ACCEPTED
input |
---|
20 50 1 2 1 4 1 5 2 3 ... |
correct output |
---|
7 20 8 9 10 11 12 13 14 |
user output |
---|
7 20 14 8 10 9 11 12 13 |