小单刷题笔记之寻路问题(剪枝思想)
#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 minL[110][10010];
int minLen;
int totalLen;
int totalCost;
int vis[110];
void dfs(int s){
if(s==N){
minLen=min(totalLen,minLen);
return ;
}
for(int i=0;i<G[s].size();i++){
Road r=G[s][i];
if (totalCost+r.t>K)continue;
if(!vis[r.d]){
if(totalLen+r.l>=minLen)continue;
if(totallen+r.l>=minL[r.d][totalCost+r.t]){
continue;
}
minL[r.d][totalCost+r.t]=totaLen+r.l;
totalLen+=r.l;
totalCost+=r.t;
vis[r.d]=1;
dfs(r.d);
vis[r.d]=0;
totalLen-=r.l;
totalCost-=r.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 i=0;i<110;i++){
for(int j=0;j<10010;j++){
minL[i][j]=1<<30;
}
}
memset(vis,0,sizeof(vis));
totalLen=0;
minLen=1<<28;
totalCost=0;
vis[1]=1;
dfs(1);
if(minLen<(1<<28)){
cout<<minLen<<endl;
}
return 0;
}
上一篇:
IDEA上Java项目控制台中文乱码
