N個城市,編號1到N。城市間有R條單向道路。
每條道路連接兩個城市,有長度和過路費兩個屬性。
Bob只有K塊錢,他想從城市1走到城市N。問最短共需要走多長的路。如果到不了N,輸出-1。
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
int K,N,R;
struct Road
{
int d,L,t;
};
vector< vector< Road> >G(110);
int minLen=1<<30;
int minL[110][10100];
int totalLen;
int totalCost;
int visited[110];
void dfs(int s)
{
if(s==N)
{
minLen=_MIN(minLen,totalLen);
return;
}
for(int i=0;i<G[s].size();i++)
{
Road r=G[s][i];
if(!visited[r.d])
{
int cost=totalCost+G[s][i].t;
if(cost>K)
{
continue;
}
if(totalLen+G[s][i].L>=minLen||totalLen+G[s][i].L>=minL[r.d][cost])
{
continue;
}
totalLen+=G[s][i].L;
totalCost+=G[s][i].t;
minL[r.d][cost]=totalLen;
visited[r.d]=1;
dfs(r.d);
visited[r.d]=0;
totalLen-=G[s][i].L;
totalCost-=G[s][i].t;
}
}
}
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)
{
G[s].push_back(r);
}
}
for(int m=0;m<110;m++)
{
for(int n=0;n<10100;n++)
{
minL[m][n]=1<<30;
}
}
memset(visited,0,sizeof(visited));
totalLen=0;
minLen=1<<30;
totalCost=0;
visited[1]=1;
dfs(1);
if(minLen<(1<<30))
{
cout<<minLen<<endl;
}
else
{
cout<<"-1"<<endl;
}
return 0;
}