POJ-1724-ROADS
http://poj.org/problem?id=1724
单向边最短路问题,但是每条边都有一个费用,要求你的最短路方案的总的花费不能超过限制,深搜即可
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 10000
#define INF 99999999
struct 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");
else
printf("%d\n",minilen);
return 0;
}