迷之信号塔

题目描述
有N个顶点,在顶点上放置信号塔则与之相邻的顶点能被信号覆盖到。
现在给你N-1条边,求解最少需要放置多少个信号塔才能使得所有顶点都有信号
输入
第一行:一个整数N
接下来N-1行:每行两个整数a和b(中间空格隔开)

输出
一个整数,最少需要放置信号塔的个数

样例输入

7
1 2
2 3
2 5
2 7
3 4
5 6

样例输出

3

这该死的信号塔终于有点思路了了了
但还是不过,希望路过的dl看看,留下点思路给我这小菜鸡

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int mp[maxn][maxn];
int f[maxn],dp[maxn];
int vit[maxn];
int n;
void dfs(int u)
{
    vit[u]=1;
    for(int i=1;i<=n;i++){
        if(mp[u][i]&&!vit[i])
            vit[i]=1;
    }
    vit[f[u]]=1;    //父顶点的父顶点也要标记
    return;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n-1;i++){
        int a,b;
        scanf("%d%d",&a,&b);
          if(a>b)swap(a,b); //因为为无向图,所以可以把a>b的情况变为a<b(将无根树变为以1为根的有根树)
        mp[a][b]=1;
        f[b]=a;      //记录这条边是由a->b的,即顶点b的前顶点(父顶点)是a
    }
    for(int i=1;i<=n;i++){
        dp[i]=dp[f[i]]+1;   //统计各个顶点的深度
    //(这里需要注意的是那个边的情况只能为(a<b),如果有a>b的情况,二个for循环可以解决问题)因为上面交换了大小,所以就不需要                         
    }
    int ans=0;
    while(1){
        int p=0;
        for(int i=1;i<=n;i++){
            if(!vit[i]&&dp[i]>dp[p]){  //从最深的顶点开始遍历,才能保证信号塔数目最少
                p=i;
            }
        }
        if(p==0)break;     //顶点都遍历完了,跳出循环
        vit[p]=1;          //标记已遍历过
        dfs(f[p]);         //拿父顶点继续遍历,将与父顶点所连接的顶点全部标记
        ans++;             //信号塔数目加1
    }
    printf("%d\n",ans);
    return 0;
}

最后感谢王盈钦dl的提醒,然我不在自闭了。。。。。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
这是一个有趣的问题,需要一些数学知识。证明的核心是使用Catalan数和矩阵乘法的关系。 首先,我们知道n个顶点的凸多边形有(n-2)!种三角剖分方法。这个结论可以通过归纳证明。当n=3时,显然只有一种方法。当n>3时,我们可以选择一个顶点,连接其它任意一个顶点形成一条边,并将多边形分成两个子多边形。这样子多边形的顶点数分别为k和n-k+1,其中k可以取1~n-2。我们可以对两个子多边形分别递归求解,最后将它们的三角剖分方法总数相乘即可得到n个顶点凸多边形的三角剖分方法数。(这里省略了证明细节) 其次,我们知道n-1个矩阵相乘也可以表示为一个递归过程。假设我们要计算A1*A2*...*An,其中Ai的维度为mi x mi+1,那么我们可以选择一个位置k,将矩阵乘积分成两部分:A1*A2*...*Ak和Ak+1*Ak+2*...*An。这两部分分别递归计算,然后将它们相乘。 现在的问题是如何将n个顶点凸多边形的三角剖分方法数与n-1个矩阵相乘的方法数联系起来。我们发现,它们都可以表示为一个递归过程,并且每次递归都可以选择一个位置分成两部分。对于n个顶点凸多边形的三角剖分方法数,我们是选择一个顶点划分成两个子多边形;对于矩阵乘法,我们是选择一个位置将矩阵乘积分成两部分。这种相似性是很自然的。 那么它们具体如何联系起来呢?我们知道Catalan数Cn=(2n)!/((n+1)!n!)表示n个节点的二叉树的数量。并且它有一个很著名的递推式Cn=C0Cn-1+C1Cn-2+...+Cn-1C0。我们可以将这个递推式稍加变形:Cn-1=C0Cn-2+C1Cn-3+...+Cn-2C0。这个式子与n个顶点凸多边形的三角剖分方法数的递归式非常相似,只需要将Catalan数换成凸多边形的三角剖分方法数即可。这是因为凸多边形的三角剖分方法数也可以看作是一些子多边形的三角剖分方法数的累计,类似于Catalan数定义中的二叉树。 现在我们只需要证明这个递推式与n-1个矩阵相乘的递推式是等价的即可。这个证明比较抽象,可以参考一些已有的文献。简单来说,就是考虑一个n个节点的二叉树,把它表示成它的根节点和左右子树组成的矩阵乘积形式,就可以将二叉树的递推式转化成矩阵乘积的递推式,从而证明它们等价。 综上所述,n个顶点凸多边形的三角剖分方法数与n-1个矩阵相乘的方法数是相同的,证毕。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值