首页 > 代码库 > 中山大学校队选拔赛第一章题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日