【11.4 测试】Dash Speed

【题目描述】

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

猜你喜欢

转载自www.cnblogs.com/wuhu-JJJ/p/11793227.html