【题目描述】
比特山是比特镇的飙车圣地。在比特山上一共有n个广场,编号依次为1到n,这些广场之间通过n1条双向车道直接或间接地连接在一起,形成了一棵树的结构。
因为每条车道的修建时间以及建筑材料都不尽相同,所以可以用两个数字li;ri量化地表示一条车道的承受区间,只有当汽车以不小于li且不大于ri的速度经过这条车道时,才不会对路面造成伤害。
Byteasar最近新买了一辆跑车,他想在比特山飙一次车。Byteasar计划选择两个不同的点S;T,然后在它们树上的最短路径上行驶,且不对上面任意一条车道造成伤害。
Byteasar不喜欢改变速度,所以他会告诉你他的车速。为了挑选出最合适的车速,Byteasar一共会向你询问m次。请帮助他找到一条合法的道路,使得路径上经过的车道数尽可能多。
【输入格式】
从文件speed.in中读入数据。
第一行包含两个正整数n;m,表示广场的总数和询问的总数。
接下来n1行,每行四个正整数ui;vi;li;ri,表示一条连接ui和vi的双向车道,且承受区间为[li;ri]。
接下来m行,每行一个整数qi,分别表示每个询问的车速。
【输出格式】
输出到文件speed.out中。
输出m行,每行一个整数,其中第i行输出车速为qi时的最长路径的长度,如果找不到合法的路径则输出0。
【样例输入】
53
3224
1525
4522
1235
1
2
3
【样例输出】
0
2
3
题解:祭上我的20分dfs代码。其他的实在打不出来%%%
(伸懒腰,舒服!)
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,vis[66],ans;
int head[66],cnt,x,y,ll,rr;
struct node{
int to,next,l,r,flag;
}e[66];
void add(int x,int y,int ll,int rr){
e[++cnt].to=y; e[cnt].r=rr; e[cnt].l=ll;
e[cnt].next=head[x]; head[x]=cnt;
}
void dfs(int sum,int now){
ans=max(ans,sum);
for(int i=head[now];i;i=e[i].next){
if(vis[e[i].to]==0 && e[i].flag==1){
vis[e[i].to]=1;
dfs(sum+1,e[i].to); //vis[e[i].to]=0;
}
}
}
int main(){
freopen("speed.in","r",stdin);
freopen("speed.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=1;i<n;i++){
scanf("%d %d %d %d",&x,&y,&ll,&rr);
add(x,y,ll,rr); add(y,x,ll,rr);
}
//cout<<cnt;
while(m--){
scanf("%d",&x); ans=0;
for(int i=1;i<=cnt;i++)
if(x>=e[i].l && x<=e[i].r) e[i].flag=1;
else e[i].flag=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++) dfs(0,i);
printf("%d\n",ans);
}
return 0;
}