poj1724 ROADS 解题报告

来源:互联网 发布:北京seo公司 编辑:程序博客网 时间:2024/06/05 00:29

这题有很多种做法,我是无脑深搜  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;}


0 0
原创粉丝点击