結果
問題 |
No.317 辺の追加
|
ユーザー |
![]() |
提出日時 | 2025-01-19 12:05:10 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 48 ms / 2,000 ms |
コード長 | 1,474 bytes |
コンパイル時間 | 1,483 ms |
コンパイル使用メモリ | 161,436 KB |
実行使用メモリ | 15,616 KB |
最終ジャッジ日時 | 2025-01-19 12:05:18 |
合計ジャッジ時間 | 5,225 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 38 |
ソースコード
#include<bits/stdc++.h> #define ll long long using namespace std; ll read() { ll s=0,p=1; char c; c=getchar(); while((c>'9'||c<'0')&&c!='-') c=getchar(); if(c=='-') { p=-1; c=getchar(); } while(c>='0'&&c<='9') { s=(s<<3)+(s<<1)+c-'0'; c=getchar(); } return s*p; } inline void write(ll x) { if(x==0) return; if(x<0) { putchar('-'); write(-x); return; } write(x/10); putchar(x%10+'0'); return; } ll n,m,h[200000],f[200000],l,dfn[200000],mi,dp[200000],tot[200000],zl,v[200000],w[200000]; struct bs{ ll n,t; }e[200000]; void cr(ll x,ll y) { e[++l].t=y; e[l].n=h[x]; h[x]=l; } void dfs(ll x,ll fa) { dfn[x]=1; for(int i=h[x];i;i=e[i].n) if(e[i].t!=fa&&e[i].t!=x&&!dfn[e[i].t]) { dfs(e[i].t,x); dfn[x]+=dfn[e[i].t]; } return; } int main() { ll x,y; n=read();m=read(); while(m) { m--; x=read();y=read(); cr(x,y); cr(y,x); } l=0; for(int i=1;i<=n;i++) { dp[i]=n+1; if(!dfn[i]) { dfs(i,-1); f[dfn[i]]++; if(f[dfn[i]]==1) tot[++l]=dfn[i]; } } for(int i=1;i<=l;i++) { x=tot[i];y=1; while(f[x]>=y) { v[++zl]=y; w[zl]=y*x; f[x]-=y; y*=2; } if(f[x]) { v[++zl]=f[x]; w[zl]=f[x]*x; } } dp[0]=0; for(int i=1;i<=zl;i++) for(int k=n;k>=w[i];k--) dp[k]=min(dp[k],dp[k-w[i]]+v[i]); for(int i=1;i<=n;i++) if(dp[i]==n+1) { write(-1); putchar('\n'); } else printf("%lld\n",dp[i]-1); return 0; }