結果

問題 No.317 辺の追加
コンテスト
ユーザー vjudge1
提出日時 2026-02-03 10:23:13
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
結果
WA  
実行時間 -
コード長 968 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 3,557 ms
コンパイル使用メモリ 340,496 KB
実行使用メモリ 11,008 KB
最終ジャッジ日時 2026-02-03 10:23:22
合計ジャッジ時間 8,820 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 13 WA * 25
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;

vector<int> e[100009];
queue<int> q;
bool vis[100009];

int cnt[100009];
int dp[100009];

int main(){
	memset(dp, 0x3f, sizeof dp);
	dp[0]=0;
	
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i=1; i<=m; i++){
		int u, v;
		scanf("%d%d", &u, &v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	
	for (int i=1; i<=n; i++){
		if (vis[i])	continue;
		
		int num=0;
		q.push(i);
		while (q.size()){
			int x=q.front(); q.pop();
			if (vis[x])	continue;
			vis[x]=1; num++;
			for (int j=0; j<e[x].size(); j++){
				int y=e[x][j];
				if (!vis[y])	q.push(y);
			}
		}
		cnt[num]++;
	}
	
	for (int i=1; i<=n; i++) // \sqrt(n)
		for (int j=17; j>=0; j--){ // log(n)
			if (cnt[i]>=(1<<j)){ // ??? 
				cnt[i]-=(1<<j);
				for (int k=n-(1<<j)*i+1; k>=0; k--)
					dp[k+(1<<j)*i]=min(dp[k+(1<<j)*i], dp[k]+(1<<j));
			}
		}
	
	for (int i=1; i<=n; i++)
		if (dp[i]<1e9)
			printf("%d\n", dp[i]-1);
		else
			printf("-1\n");
	return 0;
}
0