題目的意思:給出一定的錢,從1到N,每走一條路徑都需要一定的花費,問從1到N在花費不超過的情況下,最短路徑。
這題可以用深搜來做,也可以用dijkstra的優先隊列來做
深搜的方法:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int K , N , E ;
int min_distance ;
int curdistance ,curcost;
bool visit[105] ;
int head[105] , t ;
struct node {
int u , v , d , w ;
int next ;
}Adjlist[100005] ;
void CreateGraph (int K , int N , int E )
{
int u , v , d , w ;
memset(head , 0 , sizeof(head) ) ; //init
t = 1 ;
while ( E-- )
{
scanf("%d%d%d%d" , &u , &v , &d , &w ) ;
Adjlist[t].u = u ;
Adjlist[t].v = v ;
Adjlist[t].d = d;
Adjlist[t].w = w ;
Adjlist[t].next = head[u] ;
head[u] = t++ ;
}
}
void dfs ( int u )
{
if ( curcost > K || (curdistance >=min_distance) )
return ;
if ( u == N )
{
min_distance = curdistance ;
return ;
}
for (int i = head[u] ; i ; i = Adjlist[i].next )
if ( ! visit[Adjlist[i].v] )
{
visit[Adjlist[i].v] = true ;
curdistance+= Adjlist[i].d;
curcost+=Adjlist[i].w;
dfs ( Adjlist[i].v ) ;
visit[Adjlist[i].v] = false ;
curdistance-= Adjlist[i].d;
curcost-=Adjlist[i].w;
}
}
int main ()
{
//freopen("a.txt","r",stdin);
//int test ;
//scanf("%d" , &test ) ;
//while ( test -- )
//{
scanf("%d%d%d" , &K , &N , &E ) ;
CreateGraph ( K , N , E ) ;
min_distance = 2000000000 ;
memset ( visit , false , sizeof(visit) ) ;
curdistance=0;
curcost=0;
visit[1]=true;
dfs( 1 ) ;
if ( min_distance != 2000000000 )
printf("%d\n" , min_distance );
else
printf("-1\n");
//}
return 0 ;
}
dijkstra的優先隊列:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct Map
{
int next;
int v;
int w;
int len;
int coins;
}map[100005];//鄰表
int head[105];
struct Node
{
int a;
int len;
int coins;
bool operator < (const Node &b) const
{
if(len==b.len) return coins>b.coins;
return len>b.len;
}
}start,temp,tex;
priority_queue<Node>Q;
int K,N,M;
int dijkstra(int k)
{
int i;
start.a=map[k].v;
start.len=0;
start.coins=0;
Q.push(start);
while(!Q.empty())
{
temp=Q.top();
Q.pop();
if(temp.a==N)
return temp.len;//尋找到目標結點
for(i=head[temp.a];i;i=map[i].next)
if(temp.coins+map[i].coins<=K)
{
tex.a=map[i].w;
tex.len=temp.len+map[i].len;
tex.coins=temp.coins+map[i].coins;
Q.push(tex);
}
}
return -1;
}
int main()
{
//freopen("aa.txt","r",stdin);
int a,b,l,va,t,i,k,p;
//scanf("%d",&t);
//while(t--)
//{
memset(head,0,sizeof(head));
scanf("%d%d%d",&K,&N,&M);
p=1;
for(i=1;i<=M;i++)
{
scanf("%d%d%d%d",&a,&b,&l,&va);//建立鄰接表
if(a==1)
k=p;
map[p].v=a;
map[p].w=b;
map[p].len=l;
map[p].coins=va;
map[p].next=head[a];
head[a]=p;
p++;
}
printf("%d\n",dijkstra(k));
//}
return 0;
}