結果
問題 | No.317 辺の追加 |
ユーザー |
![]() |
提出日時 | 2025-01-21 22:34:40 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 160 ms / 2,000 ms |
コード長 | 992 bytes |
コンパイル時間 | 2,079 ms |
コンパイル使用メモリ | 198,984 KB |
実行使用メモリ | 15,372 KB |
最終ジャッジ日時 | 2025-01-21 22:34:49 |
合計ジャッジ時間 | 8,723 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 38 |
ソースコード
#include<bits/stdc++.h> using namespace std; long long n,m,vis[100005],Pow[30],cnt,Size,A[100005],w[100005],num[100005],k,f[100005],B[100005]; vector<int>e[100005]; void dfs(int x) { vis[x]=1,Size++; for(auto v:e[x]) if(!vis[v]) dfs(v); } int main() { cin>>n>>m,Pow[0]=1; for(int i=1;i<=25;i++) Pow[i]=Pow[i-1]*2; for(int i=1;i<=m;i++) { int x,y; cin>>x>>y,e[x].push_back(y),e[y].push_back(x); } for(int i=1;i<=n;i++) if(!vis[i]) Size=0,dfs(i),A[++cnt]=Size; sort(A+1,A+cnt+1); for(int i=1;i<=cnt;i++) if(A[i]!=A[i-1]) w[++k]=A[i],num[k]=1; else num[k]++; memset(A,0,sizeof A),cnt=0; for(int i=1;i<=k;i++) { for(int j=0;j<=25;j++) if(num[i]>=Pow[j]) num[i]-=Pow[j],A[++cnt]=w[i]*Pow[j],B[cnt]=Pow[j]; if(num[i]) A[++cnt]=w[i]*num[i],B[cnt]=num[i]; } memset(f,0x3f,sizeof f),f[0]=0; for(int i=1;i<=cnt;i++) for(int j=n;j>=A[i];j--) f[j]=min(f[j],f[j-A[i]]+B[i]); for(int i=1;i<=n;i++) if(f[i]==0x3f3f3f3f3f3f3f3f) cout<<"-1\n"; else cout<<f[i]-1<<"\n"; return 0; }