結果
問題 | No.317 辺の追加 |
ユーザー |
![]() |
提出日時 | 2015-12-10 23:48:35 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 331 ms / 2,000 ms |
コード長 | 874 bytes |
コンパイル時間 | 1,329 ms |
コンパイル使用メモリ | 160,608 KB |
実行使用メモリ | 19,584 KB |
最終ジャッジ日時 | 2024-09-15 07:45:02 |
合計ジャッジ時間 | 10,692 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 38 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define Nmax 100010bool used[Nmax];list<int> edges[Nmax];int cs[Nmax];int dp[Nmax];int countf(int i){if(used[i]) return 0;used[i]=true;int result = 1;for(auto it=edges[i].begin(); it!=edges[i].end(); ++it){result += countf(*it);}return result;}int main(){int N,M;cin>>N>>M;for(int j=0;j<M;++j){int u,v;cin>>u>>v;edges[u].push_back(v);edges[v].push_back(u);}dp[0]=-1;for(int k=1;k<=N;++k){dp[k]=N;}for(int i=1;i<=N;++i){int c = countf(i);++cs[c];}int sum=0;for(int c=1;c<=N;++c){int s=cs[c];int d=1;while(s){int e=d;if(e>s)e=s;s-=e;int ce=c*e;sum+=ce;for(int k=sum-ce;k>=0;--k){if(dp[k+ce]>e+dp[k]){dp[k+ce]=e+dp[k];}}d*=2;}}for(int k=1;k<=N;++k){cout << (dp[k]<N?dp[k]:-1) << endl;}}