結果
問題 |
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 200005 using 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; }