【题目描述】
比特山是比特镇的飙车圣地。在比特山上一共有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; }