HDU 5326(2015多校3)-Work(dfs)

题目地址:HDU 5326

题意:给一张有向图n个点,n - 1(。。。。输入n-1)条边。 A指向B代表A管理B,然后可以间接管理,比如A管理B,B管理C,则A管理C。 现在问管理k个人的人有多少个。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
//#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
const int maxn=110;
int edge[maxn][maxn];
int sum[maxn];
int vis[maxn];
int n,k,cnt;
int dfs(int u)
{
    sum[u]=0;
    for(int i=1;i<=n;i++){
        if(edge[u][i])
            sum[u]+=dfs(i);
    }
    if(sum[u]==k)
        cnt++;
    return sum[u]+1;
}
int main()
{
    int u,v,i;
    int root;
    while(~scanf("%d %d",&n,&k)){
            memset(edge,0,sizeof(edge));
            memset(sum,0,sizeof(sum));
            memset(vis,0,sizeof(vis));
            for(i=1;i<n;i++){
                scanf("%d %d",&u,&v);
                edge[u][v]=1;
                vis[v]=1;
            }
            for(i=1;i<=n;i++){
                if(!vis[i]){
                    root=i;
                    break;
                }
            }
            cnt=0;            dfs(root);
            printf("%d\n",cnt);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-03 07:05:39

HDU 5326(2015多校3)-Work(dfs)的相关文章

HDU 5319(2015多校3)-Painter(dfs)

题目地址:HDU 5319 题意:给一个图n*m,原来全是点('.'). 现在要把图染成已给出的样子. 要求当是'\'的情况只用红色,是'/'的情况只用蓝色,当一个格子同时被红色和蓝色染得时候变成绿色.(每个格子只画一次). 思路:这题只要模拟一下刷的过程就行了,如果出现了R,就刷R刷到底,出现B就刷B,出现G就左右各刷一次. #include <stdio.h> #include <math.h> #include <string.h> #include <st

hdu 5288||2015多校联合第一场1001题

http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number of i (l<=i<=r) , that there's no j(l<=j<=r,j<>i) satisfy ai mod aj=0,now OO want to know ∑i

HDU 5347(2015多校5)-MZL&#39;s chemistry(打表)

题目地址HDU 5347 无脑流神题,自行脑补,百度大法好. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #

HDU 5344(2015多校5)-MZL&#39;s xor(水题)

题目地址:HDU 5344 题意:求所有(Ai+Aj)的异或值. 思路:可以发现(Ai+Aj)和(Aj+Ai)的异或值为0,所以最后只剩下(Ai+Ai). #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm>

HDU 5371(2015多校7)-Hotaru&#39;s problem(Manacher算法求回文串)

题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列,该子序列分为三部分,第一部分与第三部分相同,第一部分与第二部分对称,如果存在求最长的符合这种条件的序列. 思路:用Manacher算法来处理回文串的长度,记录下以每一个-1(Manacher算法的插入)为中心的最大回文串的长度.然后从最大的开始穷举,只要p[i]-1即能得出以数字为中心的最大回文串的长度,然后找到右边对应的'-1',判断p[i]是不是大于所穷举的长度,如果当前的满足三段,那么就跳出,继续

HDU 5349(2015多校5)-MZL&#39;s simple problem(优先队列)

题目地址:HDU 5349 很水的优先队列就能搞好,只不过注意如果2操作结束后的队列为空,那么Max的值为-inf. #include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set&

HDU 5323(2015多校3)-Solve this interesting problem(dfs+剪枝)

题目地址:HDU 5323 题意:给一个l,r,表示区间[l,r],问是否存在区间为[0,n]的线段树的节点区间为[l,r],如果有求最小的n,如果没有输出-1. 思路:因为L/(R-L+1)<=2015,按照线段树的性质每次分区间序号扩大两倍,所以可以得出差不多有22层,所以用爆搜就可以,由上把[l,r]区间不断扩张,直到满足l==0为止.顺便剪剪枝. #include <stdio.h> #include <math.h> #include <string.h>

HDU 5305 Friends(2015多校第二场 dfs + 剪枝)

Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 552    Accepted Submission(s): 253 Problem Description There are  people and  pairs of friends. For every pair of friends, they can choos

HDU 5387(2015多校8)-Clock(模拟)

题目地址:HDU 5387 题意:给你一个格式为hh:mm:ss的时间,问时针与分针.时针与秒针.分针与秒针之间夹角的度数是多少,若夹角度数不是整数,则输出A/B最简分数形式. 思路:每秒钟,分针走是0.1°,时针走(1/120)°:每分钟,时针走0.5°.所以对于时针的角度来说总共走动了h*30+m*0.5+s/120,对于分针的角度来说总共走掉了m*6+s*0.1,对于秒针来说,总共走动了s*6.因为乘法比较除法来说时间复杂度更精确一点,所以我们把走的角度*120,变成全部都是整数,最后再除