ICPCCamp 2017 Day 6: U of Tokyo Selection 1 - Problem A. Spanning Trees

本文介绍了一种算法,用于在一个完全图中找到指定数量的边不重复的生成树。该算法利用类似数学归纳法的方式构造解,并通过编程实现了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给一个N个点的完全图,让你输出k个边不重复的生成树。



分析:如果k > n/2直接无解,否则我们用类似数学归纳法的方法构造;可以发现从2开始才有解,而且n每增加2其构造方案数才能+1,当n为奇数时,我们可以让第n个点直接向前边的点连边来继承n-1的所有方案;当n为偶数时,我们可以直接继承n-2的所有方案,并且让[1,(n-2)/2]的边连向n-1,[(n-2)/2+1,n-2]连向n,再增加一条n到n-1的边,这样方案数就又能增加一种。


#include <cstdio>
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
int n,k;
vector<pii> edg[205];
int main()
{
	scanf("%d%d",&n,&k);
	if(k > n/2)
	{
		cout<<"-1"<<endl;
		return 0;
	}
	for(int i = 2;i <= min(n,2*k);i++)
	{
		if(i & 1) 
		 for(int j = i/2+1;j < i;j++) edg[j-i/2].push_back(make_pair(j,i));
		else 
		{
			for(int j = 1;j < i/2;j++) edg[j].push_back(make_pair(j,i));
			edg[i/2].push_back(make_pair(i-1,i));
			for(int j = 1;j <= i-2;j++) edg[i/2].push_back(make_pair((j <= (i-2)/2 ? i-1 : i),j));
		}
	}
	for(int i = 2*k+1;i <= n;i++)
	 for(int j = 1;j <= k;j++) edg[j].push_back(make_pair(j,i)); 
	for(int i = 1;i <= k;i++)
	{
		for(auto j : edg[i]) cout<<j.first<<" "<<j.second<<endl;
		cout<<endl; 
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值