結果
問題 | No.317 辺の追加 |
ユーザー |
|
提出日時 | 2016-11-25 22:40:17 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 266 ms / 2,000 ms |
コード長 | 1,415 bytes |
コンパイル時間 | 1,220 ms |
コンパイル使用メモリ | 90,496 KB |
実行使用メモリ | 13,568 KB |
最終ジャッジ日時 | 2024-11-27 11:23:41 |
合計ジャッジ時間 | 9,969 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 38 |
ソースコード
#include <iostream>#include <vector>#include <map>#include <tuple>#include <functional>#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))#define repeat_from(i,m,n) for (int i = (m); (i) < (n); ++(i))#define repeat_reverse(i,n) for (int i = (n)-1; (i) >= 0; --(i))using namespace std;template <class T> void setmin(T & a, T const & b) { if (b < a) a = b; }const int inf = 1e9+7;int main() {// inputint n, m; cin >> n >> m;vector<vector<int> > g(n);repeat (i,m) {int u, v; cin >> u >> v; -- u; -- v;g[u].push_back(v);g[v].push_back(u);}// enumerate componentsmap<int,int> components; {vector<bool> used(n);function<int (int)> go = [&](int i) {used[i] = true;int acc = 1;for (int j : g[i]) if (not used[j]) acc += go(j);return acc;};repeat (i,n) if (not used[i]) {components[go(i)] += 1;}}// dpvector<int> dp(n+1, inf);dp[0] = -1;for (auto it : components) {int size, cnt; tie(size, cnt) = it;while (cnt) for (int k = 1; k <= cnt; cnt -= k, k *= 2) {repeat_reverse (i,n+1-k*size) {setmin(dp[i+k*size], dp[i]+k);}}}// outputrepeat_from (i,1,n+1) {cout << (dp[i] == inf ? -1 : dp[i]) << endl;}return 0;}