結果
問題 | No.317 辺の追加 |
ユーザー |
![]() |
提出日時 | 2025-01-18 18:00:19 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 78 ms / 2,000 ms |
コード長 | 1,115 bytes |
コンパイル時間 | 578 ms |
コンパイル使用メモリ | 60,164 KB |
実行使用メモリ | 12,280 KB |
最終ジャッジ日時 | 2025-01-18 18:00:25 |
合計ジャッジ時間 | 5,482 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 38 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:40:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 40 | scanf("%d%d", &n, &m); | ~~~~~^~~~~~~~~~~~~~~~ main.cpp:42:31: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 42 | int x, y;scanf("%d%d", &x, &y); | ~~~~~^~~~~~~~~~~~~~~~
ソースコード
#include <iostream>#include <cstdio>#include <cstring>#define N 200005using namespace std;int n, m, cnt;int head[N], ver[2*N], nxt[2*N], tot, num[N], v[N], w[N], f[N];bool vis[N];void add(int x, int y){ver[++tot]=y, nxt[tot]=head[x], head[x]=tot;}void dfs(int x){vis[x]=1, cnt++;for (int i=head[x]; i; i=nxt[i]){int y=ver[i];if(vis[y]) continue;dfs(y);}}void init(){for (int i=1; i<=(int)2e5; i++){if(!num[i]) continue;int s=1;while(s<=num[i]){num[i]-=s;v[++cnt]=s*i;w[cnt]=s;s*=2;}if(num[i]){v[++cnt]=num[i]*i;w[cnt]=num[i];}// cout<<v[cnt]<<' '<<w[cnt]<<endl;}}int main(){memset(f, 0x3f, sizeof f);f[0]=0;scanf("%d%d", &n, &m);for (int i=1; i<=m; i++){int x, y;scanf("%d%d", &x, &y);add(x, y), add(y, x);}for (int i=1; i<=n; i++){if(!vis[i]){cnt=0;dfs(i);num[cnt]++;}}cnt=0;init();for (int i=1; i<=cnt; i++){for (int j=n; j>=v[i]; j--){f[j]=min(f[j], f[j-v[i]]+w[i]);}}for (int i=1; i<=n; i++) printf("%d\n", f[i]!=0x3f3f3f3f?f[i]-1:-1);return 0;}