poj 1724 ROADS

  这道题跟poj 3411 差不多,不过这道题得用邻接表,不然就超时了,这道题我的代码跑了63MS,324K,我瞅了一下列表,好多人都跑了0MS,你NB!!

  DFS。

  题意:有n 城市,r条路,有k这么多的钱。不同的路花费不一样,求从1到n最快且总花费不超过k的长度。这道题用邻接表还是比较快的,用POJ3411那道题用的保存信息的结构果断超时啊啊啊。。。用邻接表也TLE了几次,最后由增加了几句 if 语句,才算AC。

/*
FUCK!! 终于不超时了
*/
#include<stdio.h>
#include<string.h>

struct node {
    int d,t,l;
    int next;
}road[10010];
int head[110],visit[110];
const int inf = 99999999;
int minlen,tot;
int k,n,r;
void Build(int s,int d,int l,int t)
{
    road[tot].d=d;road[tot].t=t;
    road[tot].l=l;road[tot].next=head[s];
    head[s]=tot++;
}
void DFS(int a,int len,int fee)
{
    if(a==n && fee<=k && minlen>len)
    {
        minlen=len;
        return ;
    }
    if(len>=minlen) return;
    if(fee>k)   return;
    if(a==n)    return;
    for(int i=head[a];i!=-1;i=road[i].next)
    {
        if(road[i].t+fee<=k && !visit[road[i].d])
        {
            int b=road[i].d;
            visit[b]++;
            DFS(b,road[i].l+len,road[i].t+fee);
            visit[b]--;
        }
    }
}
int main()
{
    int s,d,l,t;
    while(scanf("%d%d%d",&k,&n,&r)!=EOF)
    {
        tot=0;
        memset(head,-1,sizeof(head));
        memset(visit,0,sizeof(visit));

        for(int i=1;i<=r;i++)
        {
            scanf("%d%d%d%d",&s,&d,&l,&t);
            Build(s,d,l,t);
        }

        minlen=inf;

        DFS(1,0,0);

        if(minlen==inf)
            printf("-1\n");
        else
            printf("%d\n",minlen);
    }
    return 0;
}

 

 

posted @ 2013-08-31 22:37  yongren1zu  阅读(261)  评论(0编辑  收藏  举报