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;

}

  

 

你可能感兴趣的:(poj)