原题 poj 1724:http://poj.org/problem?id=1724
题意:给你钱数 k,有n个城市(编号1~n),r 条路
然后花费要在k以内,从1到达n城市的最短路。
解法:方法很多:可以用优先队列+bfs(/dijkstra),也可以用spfa+dfs(/dp),也可以用vector 存储一下边的关系。
代码1:优先队列+bfs
#include
#include
#include
#include
#include
#include
using namespace std;
#define N 120
int tot;
int first[N];
int k,n,r;
struct node
{
int u,l,c;
friend bool operator <(node a,node b)
{
if(a.l==b.l)
return a.c>b.c;
else
return a.l>b.l;
}
};
struct edge
{
int v,l,c,next;
}e[N*N];
void addedge(int u,int v,int l,int c,int &tot)
{
e[tot].v=v;
e[tot].l=l;
e[tot].c=c;
e[tot].next=first[u];
first[u]=tot++;
}
void init()
{
memset(first,-1,sizeof(first));
tot=0;
}
int bfs()
{
priority_queue q;
node x;
x.u=1,x.c=0,x.l=0;
q.push(x);
while(!q.empty())
{
node now=q.top();
q.pop();
if(now.u==n)
return now.l;
for(int i=first[now.u];i!=-1;i=e[i].next)
{
int v=e[i].v,l=e[i].l,c=e[i].c;
if(now.c+c>k)
continue;
node nn;
nn.u=v;
nn.c=now.c+c;
nn.l=now.l+l;
q.push(nn);
}
}
return -1;
}
int main()
{
init();
scanf("%d%d%d",&k,&n,&r);
//cin>>k>>n>>r;
int u,v,l,c;
for(int i=0;i>u>>v>>l>>c;
addedge(u,v,l,c,tot);
}
printf("%d\n",bfs());
return 0;
//cout<
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define N 120
int k,n,r;
struct node
{
int v,l,c;
friend bool operator <(node a,node b)
{
if(a.l==b.l)
return a.c>b.c;
else
return a.l>b.l;
}
};
vectore[N];
int bfs()
{
priority_queue q;
node x;
x.v=1,x.c=0,x.l=0;
q.push(x);
while(!q.empty())
{
node now=q.top();
q.pop();
if(now.v==n)
return now.l;
for(int i=0; i
四种算法的模版:http://blog.csdn.net/zhongyanghu27/article/details/8221276