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;}
- poj1724 ROADS
- poj1724 - ROADS
- ROADS poj1724
- POJ1724--ROADS
- POJ1724 ROADS
- POJ1724-ROADS
- poj1724 ROADS
- poj1724 ROADS
- POJ1724 ROADS
- poj1724——ROADS
- poj1724 ROADS (spfa + A*)
- poj1724 ROADS 解题报告
- poj1724 roads(dfs)
- poj1724——ROADS
- POJ1724 ROADS最短路问题
- poj1724 openjudge1724 ROADS 解题记录
- 【POJ1724】ROADS 某邪恶最短路
- poj1724--ROADS(最短路变形)
- 搜索引擎(一)体系结构 思维导图
- C++中string的连续加法需要注意的一个地方
- Six Degrees of Cowvin Bacon
- 当心-链路层复用加ebtables的broute的恶果
- 云计算的基本概念
- poj1724 - ROADS
- 使用eclipse编译含有C++11特性的代码
- sort
- jasper iReport 插入图片问题
- ADT_20新建项目Android Support library not installed问题
- Android程序完全退出的三种方法
- 【字典树】 poj1204 Word Puzzles
- Android入门/Intent(六)
- JAVA面试题JSP