POJ 1724 ROADS DFS+剪枝

来源:互联网 发布:英雄杀礼包软件 编辑:程序博客网 时间:2024/05/20 03:41

要求求出花费在K一下的从1到n的最短路,注意是one-way roads。

DFS+剪枝即可。

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#include <vector>#include <cmath>#include <set>#include <iomanip>#define inf 2000000using namespace std;int K,n,m;struct Edge{int u,v;int cost;int len;int next;}edge[22222];int head[22222];int visit[22222];int num;int ans;int addedge(int u,int v,int len,int cost){edge[num].u=u;edge[num].v=v;edge[num].cost=cost;edge[num].len=len;edge[num].next=head[u];head[u]=num++;}void dfs(int root,int l,int k){if(k>K){return;}if(l>ans){return ;}if(root==n){ans=min(ans,l);//cout<<ans<<endl;return ;}for(int i=head[root];i!=-1;i=edge[i].next){int v=edge[i].v;int len=edge[i].len;int cost=edge[i].cost;if(visit[i]==0){continue;}if(k+cost>K){continue;}visit[i]=0;dfs(v,l+len,k+cost);visit[i]=1;}return ;}int main(){int u,v,len,cost;while(scanf("%d",&K)!=EOF){scanf("%d%d",&n,&m);num=0;ans=inf;memset(visit,1,sizeof(visit));memset(head,-1,sizeof(head));for(int i=0;i<m;i++){scanf("%d%d%d%d",&u,&v,&len,&cost);addedge(u,v,len,cost);}dfs(1,0,0);if(ans==inf){cout<<"-1"<<endl;}else{printf("%d\n",ans);}}return 0;}


0 0
原创粉丝点击