POJ-1724-ROADS

来源:互联网 发布:淘宝客服简历 编辑:程序博客网 时间:2024/05/03 07:12

POJ-1724-ROADS

http://poj.org/problem?id=1724

单向边最短路问题,但是每条边都有一个费用,要求你的最短路方案的总的花费不能超过限制,深搜即可

#include<stdio.h>#include<string.h>#include<stdlib.h>#define M 10000#define INF 99999999struct edge{int v;int len;int toll;int next;}edges[4*M];int edgenum;int visit[101];int head[101];int minilen,totallen,totalcost;int n,k,reach;void addEdge(int a,int b,int len,int t){edges[edgenum].v=b;edges[edgenum].len=len;edges[edgenum].toll=t;edges[edgenum].next=head[a];head[a]=edgenum;edgenum++;}void dfs(int index){int i;if(index==n){reach=1;if(totallen<minilen)minilen=totallen;return;}for(i=head[index];i!=-1;i=edges[i].next){if(!visit[edges[i].v]&&totallen+edges[i].len<minilen&&totalcost+edges[i].toll<=k){visit[edges[i].v]=1;totallen+=edges[i].len;totalcost+=edges[i].toll;dfs(edges[i].v);visit[edges[i].v]=0;totallen-=edges[i].len;totalcost-=edges[i].toll;}}}int main(){int r;int i,s,d,len,t;scanf("%d%d%d",&k,&n,&r);for(i=1;i<=n;i++)head[i]=-1;for(i=1;i<=r;i++){scanf("%d%d%d%d",&s,&d,&len,&t);addEdge(s,d,len,t);}memset(visit,0,sizeof(visit));totallen=totalcost=0;reach=0;minilen=INF;visit[1]=1;dfs(1);if(reach==0)printf("-1\n");elseprintf("%d\n",minilen);    return 0;}