地址:http://poj.org/problem?id=1724
题意:
给定一个图,图中每条路都有 路长Length 和 过路费Toll 两个参数,一条路连接两个城市(两个城市之间有且仅有一条路)
现在只有 K 块钱,要求从第一个城市出发,到达第N个城市的最短路,也就是说在 K 花费内的最短路。
解法:
DFS,配合着当前总长度和花费的剪枝。
此外,这题的邻接链表的构造方法真是很赞,呃,不是自夸,我从网上山寨过来的。。。。
#include<iostream>
#include<cstring>
using namespace std;
const int inf = 1000000000;
const int Road = 10001;
const int City = 101;
struct {
int s,d,l,t; //source,destination,length,toll
int next; //指向相同source的下一条边
} road[Road];
int p; //指针
int list_head[City];
bool visit[City];
int minlen;
int K,N,R;
void dfs(int s,int len,int toll){
if(len>minlen) return;
if(s==N){
if(len<minlen&&toll>=0) minlen = len;
return ;
}
for(int i= list_head[s];i!=-1;i=road[i].next){
int td = road[i].d;
int tl = road[i].l;
int tt = road[i].t;
if(!visit[td]&&tt<=toll){
visit[td]=1;
dfs(td,len+tl,toll-tt);
visit[td]=0;
}
}
}
int main(){
int i,j,s,d,l,t;
while(cin>>K>>N>>R){
memset(list_head,-1,sizeof(list_head));
memset(visit,0,sizeof(visit));
p = 0;
minlen=inf;
for(i=0;i<R;i++){
cin>>s>>d>>l>>t;
road[p].s=s;
road[p].d=d;
road[p].l=l;
road[p].t=t;
road[p].next=list_head[s]; //头一回见到这么建邻接链表的
list_head[s]=p++; //好吧我承认自己孤陋寡闻
}
visit[1]=1;
dfs(1,0,K);
if(minlen==inf) minlen = -1;
cout<<minlen<<endl;
}
return 0;
}