尾声-怪盗基德的逃离

来源:互联网 发布:安全研究员与程序员 编辑:程序博客网 时间:2024/06/02 10:16

背景 Background 

  怪盗基德第四次拿着战利品信心满满地离开了OIBH总部,一路上大摇大摆,好不

嚣张。OIBH的人看不下去又没办法,打算作罢,可是有一天……

当当当当……当OIBH总部的吃饭铃声响起的时候,所有正在埋头工作的大牛们都

以迅雷不及掩耳盗铃之势向食堂冲去。食堂的大门顿时被人群塞的鼓鼓的(可怜

ing...

当大牛们正在全力消灭由水稻演变而来的那东西时,突然走进来一个玉树临风英

俊潇洒人见人爱花见花开啤酒见啤酒盖开的大帅哥(啊啊啊啊啊啊啊啊啊啊……),

而他自称是一个超超超级大牛!!

超超超级大牛在听说了怪盗基德的事情后,二话不说,提笔“刷刷”的写了一页

纸,其余大牛们研究了九天九夜,终于明白了纸上写的是什么,那是一个(咳咳)

专门对付怪盗基德的陷阱!

而怪盗基德在毫不知情的情况下,竟然把四块宝石都送回了OIBH总部,还留下预

告函,将向第五块宝石发起攻势!

大牛们气愤而又坏笑着,悄悄地设下了陷阱……

结果出乎所有人的意料,宝石还是被拿走了,可是,为什么大牛们还在阴笑……

难不成,他们在怪盗基德逃离的路上设下了陷阱?

   

 描述 Description 

  果然,基德的撤退路上被布置一个巨大的迷宫。这迷宫是一个巨大的道路网,每

条路上基德需要花费的时间都不同,而每条路都需要不同的过路费。这个道路网

可以看做一个无向图,其中共有n个结点,共m对结点间有通路。1号结点是入口,

n号结点是出口。现在要求你在规定时间内,花去尽可能多的钱(据说不这样做就

不是基德的性格)帮助基德走过迷宫。注意:每条路只能走一次,走到终点即结

束而不能往回走。在钱数相同的情况下使时间尽量短。

  

  

 输入格式 Input Format 

  第一行4个整数n,m,t,v,分别是结点总数,通路总数,规定时间,及基德所拥有

的钱。接下去m行,每行4个整数a,b,c,dab表示有通路的两结点,c为此路费

时,d代表此路过路费。

  

  

 输出格式 Output Format 

  输出共2个整数t2,v2,分别表示用时和所剩钱数。你要保证t2<=tv2>=0

 

 

样例输入 Sample Input

 

8 10 10 120

1 2 2 1

1 3 1 1

1 4 2 19

2 3 2 6

3 4 1 1

3 5 2 2

5 6 2 1

6 7 1 3

7 8 3 1

4 8 7 100

 

样例输出 Sample Output

 

9 1

提示

2<=n<=100
1<=t,v<=500

 代码一:program li;
type node=record
     t,s,h:integer;
     end;
var
  z:array[1..1000,1..1000]of node;
  i,j,n,m,xs,hf,a,b,c,d,shi,money:integer;
  max,min:integer;
  y:array[1..1000]of boolean;

procedure print;
begin
writeln(min:5,hf-max:5);
end;

procedure dfs(i,shi,money:integer);
var j:integer;
begin
for j:=1 to n do
  if (z[i,j].t=1){and(y[j]=false)} then begin
    z[i,j].t:=0;z[j,i].t:=0; shi:=shi+z[i,j].s;money:=money+z[i,j].h; //y[j]:=true;
   if (j<>n)and (shi<xs)and(hf-money>=0) then dfs(j,shi,money);
   if (j=n)and (shi<xs)and(hf-money>=0) then begin
     if (money>max)or(money=max)and(shi<min) then
     begin
      min:=shi;max:=money;
      end;
     end;
    z[i,j].t:=1;z[j,i].t:=1;shi:=shi-z[i,j].s;money:=money-z[i,j].h;//y[j]:=false;
end;end;
begin
assign(input,'input.txt');
assign(output,'output.txt');
reset(input);
rewrite(output);
readln(n,m,xs,hf);
for i:=1 to m do
 begin
  readln(a,b,c,d);
  z[a,b].t:=1;z[b,a].t:=1;
  z[a,b].s:=c;z[b,a].s:=c;
  z[a,b].h:=d;z[b,a].h:=d;
 end;
 fillchar(y,sizeof(y),0);
 min:=32767; max:=0;y[1]:=true;dfs(1,0,0); print;
 close(input);close(output);
 end.

代码二:type
  xx=record
    d,t,v:integer;
    nu:longint;
  end;
var
  b:array[1..10000]of boolean;
  a:array[1..100]of integer;
  w:array[1..100,1..100]of xx;
  i,j,k,m,n,t,v,h,l:longint;
  ans,sum:longint;
procedure find(h,tt,vv:longint);
var
  i,j:integer;
begin
  if h=n then begin
    if (vv>ans)or((vv=ans)and(tt<sum)) then begin
      ans:=vv;
      sum:=tt;
    end;
    exit;
  end;
  for i:=1 to a[h] do
    if not b[w[h,i].nu] then
      if (tt+w[h,i].t<=t)and(vv+w[h,i].v<=v) then begin
        b[w[h,i].nu]:=true;
        find(w[h,i].d,tt+w[h,i].t,vv+w[h,i].v);
        b[w[h,i].nu]:=false;
      end;
end;
begin
 assign(input,'input.txt');
assign(output,'output.txt');
reset(input);
rewrite(output);
readln(n,m,t,v);
  for i:=1 to m do begin
    readln(j,k,h,l);
    inc(a[j]);
    inc(a[k]);
    w[j,a[j]].d:=k;
    w[j,a[j]].t:=h;
    w[j,a[j]].v:=l;
    w[j,a[j]].nu:=i;
    w[k,a[k]].d:=j;
    w[k,a[k]].t:=h;
    w[k,a[k]].v:=l;
    w[k,a[k]].nu:=i;
  end;
  fillchar(b,sizeof(b),0);
  sum:=10000;
  find(1,0,0);
  writeln(sum,' ',v-ans);
 close(input);close(output);
end.

0 0
原创粉丝点击