标签:
怪盗基德第四次拿着战利品信心满满地离开了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。
每个点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;
}
标签:
原文地址:http://www.cnblogs.com/a972290869/p/4185953.html