結果

問題 No.317 辺の追加
コンテスト
ユーザー vjudge1
提出日時 2026-02-03 15:12:45
言語 C++14
(gcc 15.2.0 + boost 1.89.0)
結果
WA  
実行時間 -
コード長 1,043 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 717 ms
コンパイル使用メモリ 77,660 KB
実行使用メモリ 7,848 KB
最終ジャッジ日時 2026-02-03 15:13:00
合計ジャッジ時間 4,616 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 13 WA * 25
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include<iostream>
#include<cstring>
using namespace std;
int n,m,fa[100005],siz[100005],cnt[100005],dp[100005],w[100005],v[100005],len;
void fenjie(int i)
{
	int now=1;
	while(cnt[i]>=now)
	{
		len++;
		w[len]=i;
		v[len]=now;
		cnt[i]-=now;
		now<<=1;
	}
	if(cnt[i])
		v[++len]=cnt[i];
}
int find_fa(int i)
{
	if(fa[i]==i)
		return i;
	fa[i]=find_fa(fa[i]);
	return fa[i];
}
void __marge(int x,int y)
{
	int fx=find_fa(x),fy=find_fa(y);
	if(fx!=fy)
	{
		siz[fx]+=siz[fy];
		siz[fy]=0;
		fa[fy]=fx;		
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
		siz[i]=1;
	}
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		__marge(x,y);
	}
	for(int i=1;i<=n;i++)
	{
		if(fa[i]==i)
			cnt[siz[i]]++;
	}
	for(int i=1;i<=n;i++)
	{
		if(cnt[i])
			fenjie(i);
	}
	memset(dp,0x3f,sizeof(dp));
	dp[0]=0;
	for(int i=1;i<=len;i++)
	{
		for(int j=n;j>=v[i]*w[i];j--)
			dp[j]=min(dp[j],dp[j-v[i]*w[i]]+1);
	}
	for(int i=1;i<=n;i++)
	{
		if(dp[i]<=n)
			printf("%d\n",dp[i]-1);
		else
			printf("-1\n");		
	}
	return 0;
}
0