首页 > 代码库 > tyvj 1399

tyvj 1399

P1399尾声-怪盗基德的逃离
未递交
标签:怪盗基德 VS OIBH[显示标签]
 
 

背景

怪盗基德第四次拿着战利品信心满满地离开了OIBH总部,一路上大摇大摆,好不
嚣张。OIBH的人看不下去又没办法,打算作罢,可是有一天……
当当当当……当OIBH总部的吃饭铃声响起的时候,所有正在埋头工作的大牛们都
以迅雷不及掩耳盗铃之势向食堂冲去。食堂的大门顿时被人群塞的鼓鼓的(可怜
ing...)
当大牛们正在全力消灭由水稻演变而来的那东西时,突然走进来一个玉树临风英
俊潇洒人见人爱花见花开啤酒见啤酒盖开的大帅哥(啊啊啊啊啊啊啊啊啊啊……),
而他自称是一个超超超级大牛!!
超超超级大牛在听说了怪盗基德的事情后,二话不说,提笔“刷刷”的写了一页
纸,其余大牛们研究了九天九夜,终于明白了纸上写的是什么,那是一个(咳咳)
专门对付怪盗基德的陷阱!
而怪盗基德在毫不知情的情况下,竟然把四块宝石都送回了OIBH总部,还留下预
告函,将向第五块宝石发起攻势!
大牛们气愤而又坏笑着,悄悄地设下了陷阱……
结果出乎所有人的意料,宝石还是被拿走了,可是,为什么大牛们还在阴笑……
难不成,他们在怪盗基德逃离的路上设下了陷阱?

描述

果然,基德的撤退路上被布置一个巨大的迷宫。这迷宫是一个巨大的道路网,每
条路上基德需要花费的时间都不同,而每条路都需要不同的过路费。这个道路网
可以看做一个无向图,其中共有n个结点,共m对结点间有通路。1号结点是入口,
n号结点是出口。现在要求你在规定时间内,花去尽可能多的钱(据说不这样做就
不是基德的性格)帮助基德走过迷宫。注意:每条路只能走一次,走到终点即结
束而不能往回走。在钱数相同的情况下使时间尽量短。

格式

输入格式

第一行4个整数n,m,t,v,分别是结点总数,通路总数,规定时间,及基德所拥有
的钱。接下去m行,每行4个整数a,b,c,d,a和b表示有通路的两结点,c为此路费
时,d代表此路过路费。

输出格式

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

样例1

样例输入1[复制]

 
8 10 10 1201 2 2 11 3 1 11 4 2 192 3 2 63 4 1 13 5 2 25 6 2 16 7 1 37 8 3 14 8 7 100

样例输出1[复制]

 
9 1

限制

每个点1s

提示

2<=n<=100
1<=t,v<=500
样例说明
道路网如图所示【道路上括号外为费时,括号内为过路费】
1->4->8即为所求路径,用时为9,费钱为119。

来源

From 玛维-影之歌
这不再是水题...
感谢 宇智波带狗 提供标程
感谢 kaito&aoko 提供背景

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<string>#include<cmath>#include<algorithm>#include<queue>#include<vector>#include<set>using namespace std;#define INF 1<<30int n,m,a[110][110],temp[110],ans[110],step,best;void dfs(int x){      if(x==n)      {            if(step>best)            {                 best=step;                 memcpy(ans,temp,sizeof(int)*n);            }            return ;      }      bool flag=true;      for(int i=0;i<x;i++)      {           if(temp[i]==1&&a[i][x]==0)           {                 flag=false;                 break;           }      }      if(flag)      {            step++;            temp[x]=1;            dfs(x+1);            step--;            temp[x]=0;      }      if(step+n-x-1>best)      {            temp[x]=0;            dfs(x+1);      }}int main(){      int x,y;      scanf("%d%d",&n,&m);      for(int i=0;i<n;i++)            for(int j=0;j<n;j++)                  a[i][j]=1;      for(int i=0;i<m;i++)      {            scanf("%d%d",&x,&y);            a[x-1][y-1]=0;            a[y-1][x-1]=0;      }      dfs(0);      printf("%d\n",best);      for(int i=0;i<n-1;i++)            printf("%d ",ans[i]);      printf("%d\n",ans[n-1]);      return 0;}

  

tyvj 1399