题意
C. Kefa and Park
思路
题目是dfs的问题,从根节点遍历每一条路径查找符合要求的路径的条数也就是最终的能去的餐厅数。最初用的不是vector容器来实现数于数之间的关系,而是受了并查集的思想用per数组存储每一个节点的父节点,借此来实现dfs的查找,但是不太懂时间复杂度,所以可能在建树init ( ) 的过程中会用时过多,最后也是导致超时了。vector 容器的功能强大,建立邻接表实现树,查找和输入都很方便。学了一小时,受益一辈子。通过这题对dfs函数的实现也有了一点进步,把各种不符合条件的情况去掉,余留下来的就是可行方法,用全局变量res,dfs里的flag变量判断是否到树的最底层,若到了就说明可行。
code
vector
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std; //vector ,graphs ,trees ,DFS and similar.
#define MAXN 100005
vector<int> G[MAXN];
int res=0;
int n,m;
int u,v;
int a[MAXN];
int path[MAXN];
void dfs(int root,int cnt)
{
path[root]=0;
vector<int>::iterator it;
int flag=0;
for(it=G[root].begin();it!=G[root].end();it++)
{
int t=*it;
if( path[t]==0)
{
continue;
}
else if(path[t]==-1 && (cnt+a[t])>m)
{
flag++;
continue;
}
else
{
flag++;
if(a[t]==0)
{
dfs(t,0);
}
else if(a[t]==1)
{
dfs(t,cnt+a[t]);
}
}
}
if(flag==0)
res++;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
memset(path,-1,sizeof(path));
dfs(1,a[1]);
printf("%d\n",res);
return 0;
}
用pre数组建树超时;
#include<stdio.h>
#include<queue> //http://codeforces.com/problemset/problem/580/C
#include<string.h> //C. Kefa and Park
using namespace std; //Time limit exceeded on test 14
int n,m;
int maze[100005];
int path[100005];
int pre[100005];
int judge[100005];
int ans=0;
int A[100005];
int B[100005];
void init()
{
queue<int> Q;
Q.push(1);
while(!Q.empty())
{
int first=Q.front();
Q.pop();
for(int i=1;i<=n;i++)
{
if(A[i]==first && path[B[i]]==0)
{
pre[B[i]]=A[i];
path[A[i]]=1;
Q.push(B[i]);
}
else if(B[i]==first && path[A[i]]==0)
{
pre[A[i]]=B[i];
path[B[i]]=1;
Q.push(A[i]);
}
}
}
}
int dfs(int k,int l)
{
int flag1=0;
for(int i=1;i<=n;i++)
{
if(k==pre[i] && maze[i]==1 && judge[i]==-1)
{
judge[i]=0;
int t;
t=l+1;
if(t<=m)
{
dfs(i,t);
}
else
continue;
}
else if(k==pre[i] && maze[i]==0 && judge[i]==-1)
{
judge[i]=0;
dfs(i,0);
}
else
{
flag1+=1;
}
}
if(flag1==n)
ans++;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&maze[i]);
}
pre[1]=0;
for(int i=1;i<=n-1;i++)
{
int a,b;
scanf("%d%d",&a,&b);
A[i]=a;
B[i]=b;
}
init();
memset(path,0,sizeof(path));
memset(judge,-1,sizeof(judge));
dfs(1,maze[1]);
printf("%d\n",ans);
ans=0;
}
return 0;
}