丛林探险

来源:互联网 发布:淘宝如何设置去提问 编辑:程序博客网 时间:2024/04/28 06:27

描述

东非大裂谷中有一片神秘的丛林,是全世界探险家的乐园,著名黄皮肤探险家BB一直想去试试。正好我国科学家2005年4月将首次对东非大裂谷进行科考,BB决定随科考队去神秘丛林探险。在出发之前,他搜集了国内外有关神秘丛林探险的资料,并绘制成一张地图:该地图上有若干安全点(包括入口点和出口点),并将这些安全点编号为1、2、…、n;如果一个安全点和另一个安全点有一条路直接相通,则用一条边标示;该图是一个连通图(任意两点间有至少一条路径),地图上每条路的长度和走这条路需要耗费的体力都做了标示。

KK行走速度为1,并知道自己体力为K。他想知道根据自己的体力情况能否成功地穿过丛林。

格式

输入格式

第一行两个整数n(<=5000) m(<=40000),分别表示地图上安全点的个数和边的数目;
第2行至第m+1 行每行4个整数x y c d,x、y表示有直接相联边的两个点的编号,c走这条路需要耗费的体力;d表示边的长度;(其中150<=c,d<=300)
第m+2行两个整数s t,分别表示安全的入口点和出口点的编号;
第m+3行一个整数k,表示BB的体力值;(K<10^9)
同一行上的多个数据用空格隔开。

输出格式

一个整数,如果BB能安全地从如入口穿过丛林到达出口,输出最短时间,否则输出-1

样例1

样例输入1

4 51 2 2 31 3 3 51 4 7 102 4 4 63 4 2 61 45
Copy

样例输出1

11
Copy

限制

各个测试点1s


【题解】

本题有可行性限制,所以使用dfs。注意无向图,开数组时,大小翻倍

#include<cstdio>#include<cstring>#include<queue>#define INF 0x3f3f3f3fusing namespace std;const int maxm=40010,maxn=5010;struct Edge{int to,v,c,next;}edges[maxm<<1];int Size=0;int head[maxn]={0};inline void insert(int u,int v,int w,int c){Size++;edges[Size].to=v;edges[Size].c=c;edges[Size].v=w;edges[Size].next=head[u];head[u]=Size;}int n,m;bool vis[maxn]={0};int ans=INF;int from,to,dist,cost,s,t,k;void dfs(int u,int havec,int havew){//  顶点、消耗体力、消耗路程 if(havec>k||havew>ans)return;if(u==t){ans=havew;return ;}vis[u]=true;for(int i=head[u];i;i=edges[i].next)if(!vis[edges[i].to])dfs(edges[i].to,havec+edges[i].c,havew+edges[i].v);vis[u]=false; return;}int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d%d%d",&from,&to,&cost,&dist);insert(from,to,dist,cost);insert(to,from,dist,cost);}scanf("%d%d%d",&s,&t,&k);dfs(s,0,0);printf("%d\n",ans==INF?-1:ans);return 0; } 



原创粉丝点击