poj1724 - ROADS

来源:互联网 发布:ubuntu安装远程桌面 编辑:程序博客网 时间:2024/05/22 01:00

                                    想看更多的解题报告:http://blog.csdn.net/wangjian8006/article/details/7870410
                                     转载请注明出处:
http://blog.csdn.net/wangjian8006

题目大意:有N个城市,在这N个城市之间有多条边,每条边有起点s与终点d,并且在这条边上有L长度,t费用,也就是说经过这条边需要话费t的费用。现在你身上有K的钱,从城市1到城市N的最短路径,并且费用不会超过K。

解题思路:因为是存的边,所以用邻接表的数据结构这样用到深搜的时候就可以大大缩短搜索时间。

#include <stdio.h>#include <memory.h>#define MAXV 105#define MAXE 10100#define INF 999999struct{    int s,d,l,t;    int next;}road[MAXE];int k,n,r,MinLen;int vist[MAXV],headlist[MAXV];void dfs(int v,int NowMoney,int NowLen){    int i,t;    if(NowLen>MinLen) return ; //当现在走的长度比已经有的最短长度还长,那么就不必再走了    if(NowLen<MinLen && v==n){ //如果现在所找的城市是N,并且走的长度还比最短长度短,则赋值        MinLen=NowLen;        return ;    }    for(i=headlist[v];i!=-1;i=road[i].next)        if(vist[road[i].d] && NowMoney>=road[i].t){            vist[road[i].d]=0;            dfs(road[i].d,NowMoney-road[i].t,NowLen+road[i].l);            vist[road[i].d]=1;        }}int main(){    int i,a,b,c,d,j;    while(scanf("%d",&k)!=EOF){        scanf("%d%d",&n,&r);        memset(vist,1,sizeof(vist));        memset(headlist,-1,sizeof(headlist));        for(i=0;i<r;i++){            scanf("%d%d%d%d",&road[i].s,&road[i].d,&road[i].l,&road[i].t);            road[i].next=headlist[road[i].s];//利用邻接表的表头数组将起点是一样的边连起来,这样可以很好的遍历邻边            headlist[road[i].s]=i;        }        MinLen=INF;        dfs(1,k,0);        if(MinLen!=INF)            printf("%d\n",MinLen);        else            printf("-1\n");    }    return 0;}


 

原创粉丝点击