有1-N个城市,并且给出城市之间的长度,还有花费,注意,相同城市之间可能有好几条道路,问最后花费不超过K,从城市1到N的最短距离
直接暴力dfs,然后再稍微剪枝一下就可以过,关键是处理两个城市间的多条路,在这里用邻接表处理,在搜索时候如果已经找到一组长度,在循环时候
若当前长度小于已经找到长度,就不用再dfs了,还有就是注意标记数组
#include <stdio.h>
#include <string.h>
#define MIN(a,b) (a)<(b)?(a):(b)
#define N 105
#define inf 1e8
struct city
{
int ed,len,to;
city *next;
};
city g[N];
city c[N*N];
int result,ci,mo,ca;
bool used[N];
void init()
{
for(int i=0;i<=ca;i++)
c[i].next=NULL;
for(int i=1;i<=ci;i++)
g[i].next=NULL;
memset(used,false,sizeof(used));
result=inf;
}
void dfs(int n,int left,int len)
{
if(n==ci&&left>=0)
{
result=MIN(result,len);
return ;
}
if(left<0)return ;
for(city *i=g[n].next;i!=NULL;i=i->next)
{
//printf("left: %d from %d to %d len %d mo %d\n",left,n,i->ed,i->len,i->to);
if(!used[i->ed]&&len+i->len<result&&left-i->to>=0)
{
used[i->ed]=true;
//result=len+i->len
dfs(i->ed,left-i->to,len+i->len);
used[i->ed]=false;
}
}
}
int main()
{
int so,de,le,to,cnt;
city *tmp;
//freopen("1724.in","r",stdin);
while(scanf("%d%d",&mo,&ci)!=EOF)
{
cnt=0;
init();
scanf("%d",&ca);
for(int i=0;i<ca;i++)
{
scanf("%d%d%d%d",&so,&de,&le,&to);
tmp=&c[cnt++];
tmp->ed=de;tmp->len=le;tmp->to=to;
tmp->next=g[so].next;
g[so].next=tmp;
//printf("%d %d %d\n",tmp->ed,tmp->len,tmp->to);
}
dfs(1,mo,0);
if(result==inf)printf("-1\n");
else printf("%d\n",result);
}
return 0;
}

浙公网安备 33010602011771号