ROADS(POJ) 剪枝+搜尋
阿新 • • 發佈:2018-11-30
題目描述
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節日快樂!’)