1. 程式人生 > >ROADS(POJ) 剪枝+搜尋

ROADS(POJ) 剪枝+搜尋

題目描述

N個城市,編號1到N。城市間有R條單向道路。
每條道路連線兩個城市,有長度和過路費兩個屬性。
Bob只有K塊錢,他想從城市1走到城市N。問最短共需要走多長的路。如果到不了N,輸出-1
2<=N<=100
0<=K<=10000
1<=R<=10000
每條路的長度 L, 1 <= L <= 100
每條路的過路費T , 0 <= T <= 100

輸入

輸入的第一行包含整數K,0 <= K <= 10000,Bob可以在途中花費的最大硬幣數。
第二行包含整數N,2 <= N <= 100,即城市總數。

第三行包含整數R,1 <= R <= 10000,道路總數。

以下R行中的每一行通過指定由單個空白字元分隔的整數S,D,L和T來描述一條道路:

S是源城市,1 <= S <= N.
D是目的地城市,1 <= D <= N.
L是道路長度,1 <= L <= 100
T是收費(以硬幣數表示),0 <= T <= 100

請注意,不同的道路可能具有相同的源和目的地城市。

輸出

輸出的第一行和唯一一行應包含從城市1到城市N的最短路徑的總長度,其總收費小於或等於K個硬幣。
如果此路徑不存在,則只應將數字-1寫入輸出。

輸入樣例

5  
6  
7  
1 2 2 3  
2 4 3 3  
3 4 2 4  
1 3 4 1  
4 6 2 1  
3 5 2 0  
5 4 3 2

輸出樣例

11

思路

DFS加剪枝

程式碼

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;

int K,N,R;
struct Road
{
    int d,L,t; //終點為d,長度為L,過路費為t
};
vector<vector<Road> > cityMap(110); //鄰接表

int minLen = 1<<30; //目前的最優路徑
int totalLen; //正在走的路徑的長度
int
totalCost; //正在走的路徑的花銷 int visited[110]; int minL[110][10100]; //minL[i][j]表示從1到i點,花銷為j的最短路的長度 void Dfs(int s) { if(s == N) //邊界條件 { minLen = min(minLen,totalLen); return; } for(int i=0;i<cityMap[s].size();++i) { //逐個考察s右路連到的點 int d=cityMap[s][i].d; if(!visited[d]) { int cost=totalCost+cityMap[s][i].t; if(cost>K) continue; if(totalLen+cityMap[s][i].L>=minLen|| totalLen+cityMap[s][i].L>=minL[d][cost]) continue; totalLen+=cityMap[s][i].L; totalCost+=cityMap[s][i].t; minL[d][cost]=totalLen; visited[d]=1; Dfs(d); visited[d]=0; totalCost-=cityMap[s][i].t; totalLen-=cityMap[s][i].L; } } } int main() { cin>>K>>N>>R; for(int i=0;i<R;i++) { int s; Road r; cin>>s>>r.d>>r.L>>r.t; if(s!=r.d) cityMap[s].push_back(r); } for(int i = 0;i<110;i++) { for(int j=0;j<10100;j++) { minL[i][j]=1<<30; } } memset(visited,0,sizeof(visited)); totalLen = 0; totalCost = 0; visited[1]=1; minLen=1<<30; Dfs(1); if(minLen<1<<30) cout<<minLen<<endl; else { cout<<"-1"<<endl; } return 0; }
print_r('1024節日快樂!')var_dump('1024節日快樂!')NSLog(@"1024節日快樂!")
System.out.println("1024節日快樂!");
console.log("1024節日快樂!);
print("1024節日快樂!");
printf("1024節日快樂!n");
cout << "1024節日快樂!" << endl;
Console.WriteLine("1024節日快樂!");
fmt.Println("1024節日快樂!")
Response.Write("1024節日快樂!");
alert(’1024節日快樂!’)