这题有很多种做法,我是无脑深搜 63MS
题意大致是 :
图中每条边有权值L,花费T。
给定最大花费K。
在K限定内求出从1—>N的最短路。
做法:
一个一个点搜,当前状态花费已超过K或累计距离一超过最优解,跳出
还有就是记录每个点搜到时的花费和距离 , 搜到这个点时,
如果累计花费超过 并且累计距离超过这个点的最优解,跳出
如果都小于 ,记录
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct node
{
int x,y,k,l,next;
}a[21000]; int len,first[110];
int K,n,Answer=99999999;
int A[110],d[110];
void ins( int x,int y,int k,int l )
{
len++;
a[len].x=x; a[len].y=y;
a[len].k=k; a[len].l=l;
a[len].next = first[x]; first[x] = len;
}
void get_( int x,int l,int num )
{
if( num >= Answer || l<0 )return;
if( x==n ){ Answer = min( Answer,num ); return ; }
if( l <= d[x] && num >= A[x] )return;
if( l >= d[x] && num <= A[x] )
{ d[x] = l; A[x] = num; }
for( int k=first[x];k;k=a[k].next )
{
int y=a[k].y;
get_( y,l-a[k].l,num+a[k].k );
}
}
int main()
{
memset( A,63,sizeof A );
memset( d,0,sizeof d );
memset( first,0,sizeof first ); len = 0;
int i,j,m,k,x,y,l;
scanf("%d%d%d",&K,&n,&m);
for( i=1;i<=m;i++ )
{
scanf("%d%d%d%d",&x,&y,&k,&l);
if( l>K )continue;
ins( x,y,k,l );
}
get_( 1,K,0 );
printf("%d\n",Answer);
return 0;
}