zoukankan      html  css  js  c++  java
  • poj1724ROADS(优先队列+BFS 有条件的最短路)

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

    /*poj1724ROADS
    题意是在一定的coins的限制下的最短路径;可以用Dijkstra的变形(BFS+优先队列);
    用邻接边来存储边;
    松弛过程中用优先队列(边的长度短的优先)来存储边,将符合条件(coins限制)的边都加入优先队列;
    直到找到延伸到最后一个顶点即可终止循环; 因为最先到达的一定是最短路径,在coins的限制条件下;
    */

    View Code
    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    #define MAXN 111
    int len[MAXN*MAXN],w[MAXN*MAXN],head[MAXN*MAXN],next[MAXN*MAXN],u[MAXN*MAXN],v[MAXN*MAXN];
    int coin,n,m;
    struct node
    {
    int v,dis,cost;
    node(int _v,int _dis,int _cost)
    {
    v=_v,dis=_dis,cost=_cost;
    }
    friend bool operator <(const node&a,const node&b)
    {
    if(a.dis!=b.dis)return a.dis>b.dis;
    return a.cost>b.cost;
    }
    };

    int BFS()
    {
    priority_queue<node> pq;
    pq.push(node(1,0,0));
    while(!pq.empty())
    {
    node tmp=pq.top();
    pq.pop();
    if(tmp.v==n)return tmp.dis;
    for(int e=head[tmp.v];e>=0;e=next[e])
    {
    if(tmp.cost+w[e]<=coin)//小于coin
    {
    pq.push(node(v[e],tmp.dis+len[e],tmp.cost+w[e]));
    }
    }

    }
    return -1;
    }
    int main()
    {

    while(scanf("%d%d%d",&coin,&n,&m)==3)
    {
    memset(head,-1,sizeof(head));
    for(int i=0;i<m;i++)
    {
    scanf("%d%d%d%d",&u[i],&v[i],&len[i],&w[i]);
    next[i]=head[u[i]];
    head[u[i]]=i;
    }
    printf("%d\n", BFS());
    }
    }
  • 相关阅读:
    作业十二 字符串和结构
    作业十一 指针(2)
    作业十 指针(1)
    作业九 二维数组和字符数组的应用
    作业八 一堆数组的应用
    作业七 函数及数组
    作业六 函数
    作业五 循环结构
    作业四 分支结构
    作业12总结
  • 原文地址:https://www.cnblogs.com/sook/p/2228374.html
Copyright © 2011-2022 走看看