码迷,mamicode.com
首页 > 其他好文 > 详细

tyvj 1399

时间:2014-12-26 06:12:23      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

P1399尾声-怪盗基德的逃离
未递交
 
 

背景

怪盗基德第四次拿着战利品信心满满地离开了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 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

样例输出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<<30
int 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

标签:

原文地址:http://www.cnblogs.com/a972290869/p/4185953.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!