poj 1724 ROADS

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

 2 题目大意:单向边最短路问题,但是每条边都有一个费用,要求你的最短路方案的总的花费不能超过限制。

 3 

 4 BFS+优先队列优化

 5 因为题目要求的是在给定费用下的最短距离,所以 以距离优先建队列 广搜

 6 

 7 #include<stdio.h>

 8 #include<string.h>

 9 #include<vector>

10 #include<queue>

11 using namespace std;

12 #define maxn 20000

13 #define max 0x7fffffff

14 

15 struct node

16 {

17     int d;

18     int l;

19     int t;

20     int next;

21 

22 }p[maxn*2];

23 struct nn

24 {

25     int v;

26     int l;

27     int mon;

28      friend bool operator <(nn a,nn b)

29     {

30         return a.l>b.l;

31     }

32 };

33 priority_queue<nn>g;

34 int num,k,n,r,vis[maxn*2],next[maxn],ans;

35 

36 void add(int s,int d,int l,int t)

37 {

38     p[num].d=d;

39     p[num].l=l;

40     p[num].t=t;

41     p[num].next=next[s];

42     next[s]=num++;

43 

44 

45 }

46 int BFS()

47 {

48     struct nn d,b;

49     while(!g.empty())g.pop();

50     d.l=0;

51     d.mon=0;

52     d.v=1;

53     g.push(d);

54     while(!g.empty())

55     {

56         d=g.top();g.pop();

57 

58         int a=d.v;

59         if(a==n)return d.l;

60         for(int i=next[a];i!=-1;i=p[i].next)

61         {

62             if(d.mon+p[i].t<=k)

63             {

64                 b.l=d.l+p[i].l;

65                 b.mon=d.mon+p[i].t;

66                 b.v=p[i].d;

67                 g.push(b);

68             }

69         }

70     }

71     return -1;

72 

73 }

74 

75 int main()

76 {

77     int i,s,d,l,t;

78     while(scanf("%d%d%d",&k,&n,&r)!=EOF)

79     {

80 

81         num=0;

82         memset(next,-1,sizeof(next));

83         for(i=0;i<r;i++)

84         {

85             scanf("%d%d%d%d",&s,&d,&l,&t);

86             add(s,d,l,t);

87         }

88         memset(vis,0,sizeof(vis));

89 

90 

91        int ans=BFS();

92        printf("%d\n",ans);

93 

94 

95     }

96 

97 }

你可能感兴趣的:(poj)