首页 > 代码库 > 中山大学选拔赛第一章题1【计算生成树】------2015年1月23日
中山大学选拔赛第一章题1【计算生成树】------2015年1月23日
1.1问题描述
1.2问题分析
本题主要考查图论中生成树及组合数学的求法。通过观察我们可以发现当输入为n时,我们一共有(5*n-n)=4n个点。通过思考我们可以知道,要想求得生成树,我们必须使所有五角形的圈全部破掉。那么我们可以思考:
如果对于一个五角形而言,它的每一条边都不删除,那么我们可以发现这必定不能构成生成树,因为这会导致在五角形内任意两个点会至少含有两条路径,不符合生成树的含义。所以我们可以得出如下结论:
(1)对于有边数为n的回圈,我们可以发现一共有4n个点,共有5n条边。根据生成树的定义,我们可以发现该生成树一共有4n-1条边。那么我们需要删去n+1条边。
(2)对于每一个五角形而言,我们需要删除至少一条边,因为如果不删除那么我们可以发现对于五角形的任意两个点我们都能找到至少两条路径相互可达。所以我们需要对n-1个五角形只需要删除一条边(此时一共有5种方法)。对于最后一个五角形需要删除两条边。
(3)对于需要删除两条边的五角形而言,我们可以思考,如果删除的都是非回圈边,那么最后一定会导致部分点不在生成树中,因此我们可以从此得出,删除的两条边其中一条是非回圈边,另一条是回圈边。那么此时删除的方法有4种。
分析到此,我们可以得出,所有的方法一共有:种类的方法。
1.3AC代码
#include<iostream>using namespace std;#define mod 2007int main(){ int n ; while(cin>>n) { int sum=0; sum=4*n%mod; for(int i=1;i<=n-1;i++) sum=sum*5%mod; cout<<sum%mod<<endl; } return 0;}补充:对于询问次数较多但是不同的询问数较少的情况下,可以先进行预处理(打表)。这样更加快速高效,那么我们可以写如下一个函数,然后直接调用结果就好:int ans[maxn];void process(){ for(int i=2;i<=maxn;i++) { ans[i]=4*i%mod; for(int j=1;i<i;j++) ans[i]=ans[i]*5%mod; }}
中山大学选拔赛第一章题1【计算生成树】------2015年1月23日
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。