求解poj1724 不是很难 望高手指点,必须给分,无限感激
首先看到这个题目的时候,以为不怎么难,于是用vector邻接表....谁知道TLE很多次,于是看别人的代码,下面的就是那个人的代码,首先看懂了之后我就自己写了一次,但是无限次想死,第一,为什么下面的代码中dfs这里一定要从价格为0开始遍历,只要我是改成dfs(1,K,0)然后dfs中判断访问条件处写成m-p->t>0,并且相应的改下面dfs,可是就是无限WA,题目中明明说只要不超过带的钱,选择最短路就可以啦...哎哎....
还有就是各种纠结TLE,我把判断改成下面的竟然也可以TLE
if(!visited[p->ed])//&& m+p->t<=K && (len+p->l<rt)
{
if(m+p->t>K)continue;
if(p->ed==N)
{
if(len+p->l<rt)
rt=len+p->l;
continue;
}
visited[p->ed]=1;
dfs(p->ed, m+p->t, len+p->l);
visited[p->ed]=0;
}
明明就是一个意思...只是访问了之后去判断用的钱是否超过,超过就不访问,这也TLE.....哎哎....真心受伤啦,求一个大神帮帮我....我真的想哭啦..纠结好好久这个...满意就全给分...
别人的代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int SZ=101;
int K, N, R;//最开始输入的三个数分别是钱,N个城市,R条路
int rt;//这个就是用来输出答案的,保存最短路径
bool visited[SZ];//看看能否访问
struct node
{
int ed;
int l;
int t;
node* next;
};
node g[SZ];
node sp[SZ*SZ];
int cnt;
void dfs(int st, int m, int len)
{
for(node* p=g[st].next; p!=NULL; p=p->next)
{
if(!visited[p->ed] && m+p->t<=K && (len+p->l<rt))
{
if(p->ed==N)
{
rt=len+p->l;
continue;
}
visited[p->ed]=1;
dfs(p->ed, m+p->t, len+p->l);
visited[p->ed]=0;
}
}
}
int main()
{
int i;
scanf("%d%d%d", &K, &N, &R);
for( i=1; i<=N; i++) g[i].next=NULL;
cnt=0;
for( i=1; i<=R; i++)
{
int s, d, l, t;
scanf("%d%d%d%d", &s, &d, &l, &t);
node* p=&sp[cnt++];
p->ed=d; p->l=l; p->t=t;
p->next=g[s].next;//邻接表操作
g[s].next=p;
}
rt=1000000;
memset(visited, 0, sizeof(visited));
visited[1]=1;
dfs(1, 0, 0);//这里表示从1号城市,0元钱,0路径长度开始dfs
if(rt<1000000)
printf("%d\n", rt);
else
printf("-1\n");
return 0;
}
好高级的样子,不会,帮顶