您的位置:首页 > 其它

2015多校第三场hdu5326 work

2015-07-31 10:40 211 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5326

题意:给m对朋友构成一个树,询问子树(包括孙辈)个数为k的有几个

思路:赛中小伙伴有类似于并查集的方法构造树,同时统计每个的子树有几个,ac的,赛后自己敲的时候用邻接矩阵构造的链表来写,类似于二分匹配的时候用的链表,同时用l数组和r数组记录每个点以及这个点的子树

代码:

小伙伴的并查集构造树

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <iomanip>
#include <queue>
#define maxn 105
using namespace std;

int pre[maxn],cnt[maxn];

int main()
{
int a,b,n,k,ans;
while(scanf("%d%d",&n,&k)!=EOF)
{
ans=0;
for(int i=1; i<=n; i++)//初始化
{
pre[i]=i;
cnt[i]=0;
}
for(int i=0; i<n-1; i++)//题意初始化
{
scanf("%d%d",&a,&b);
pre[b]=a;
}
for(int i=1; i<=n; i++)//并查集部分采用
{
int top=i;
while(top!=pre[top])
{
cnt[pre[top]]++;
top=pre[top];
}
}
for(int i=1; i<=n; i++)//找结果
{
if(cnt[i]==k)
{
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}


链表构造树:

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#define maxn 1000005
using namespace std;

int head[maxn];
int index;
int l[maxn],r[maxn];
int idx;
int id[maxn];

struct edge
{
int to,next;
}e[maxn];

void addedge(int a,int b)
{
e[index].to=b;
e[index].next=head[a];
head[a]=index;
index++;
}
void dfs(int u)
{
id[u]=++idx;
l[u]=idx;
for(int i=head[u];i!=-1;i=e[i].next)
dfs(e[i].to);
r[u]=idx;
}

int main()
{
int n,k;
int u,v;
while(scanf("%d%d",&n,&k)!=EOF)
{
index=0;
memset(head,-1,sizeof(head));
for(int i=0;i<n-1;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
}
dfs(1);
//for(int i=1;i<=n;i++)cout<<l[i]<<" "<<r[i]<<endl;
int sum=0;
for(int i=1;i<=n;i++)
{
if(r[i]-l[i]==k)
sum++;
}
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: