poj 1724 ROADS 夜

http://poj.org/problem?id=1724

居然直接Dfs+剪枝就可以过 受不了啦!!!!!!!

题目大意:

n个城市间有单向路 路有长度和花费两个参数

问在总花费不超过特定值的情况下从1到n的最短路 包括到不了的情况

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<algorithm>
#include<set>

using namespace std;

const int W=101;
struct node
{
    struct tt *next;
}mem[W];
struct tt
{
    int j;
    int L,T;
    struct tt *next;
};
int K,N,R,ans;
int had[W];
void build(int i,int j,int l,int T)
{
    struct tt *t=new tt;
    t->j=j;
    t->L=l;
    t->T=T;
    t->next=mem[i].next;
    mem[i].next=t;
}
void dele()
{
    for(int i=1;i<=N;++i)
    {
        mem[i].next=NULL;
    }
}
void Dfs(int x,int length,int pay)
{
    //cout<<x<<endl<<endl;;
    struct tt *t=new tt;
    t=mem[x].next;
    while(t!=NULL)
    {
        if(had[t->j]==false&&pay+t->T<=K)
        {
            if(t->j==N)
            {
                if(ans==-1||length+t->L<ans)
                ans=length+t->L;
            }else if(ans==-1||length+t->L<ans)
            {
                had[t->j]=true;
                Dfs(t->j,length+t->L,pay+t->T);
                had[t->j]=false;
            }

        }
        t=t->next;
    }
}
int main()
{
   while(scanf("%d %d %d",&K,&N,&R)!=EOF)
   {
       int s,d,l,t;
       while(R--)
       {
           scanf("%d %d %d %d",&s,&d,&l,&t);
           build(s,d,l,t);
       }
       memset(had,false,sizeof(had));
       ans=-1;
       had[1]=true;
       Dfs(1,0,0);
       printf("%d\n",ans);
       dele();
   }
   return 0;
}

  

原文地址:https://www.cnblogs.com/liulangye/p/2594984.html