zoukankan      html  css  js  c++  java
  • POJ3635 Full Tank? 优先队列BFS or 分层图最短路 or DP?

    然而我也不知道这是啥啊。。。反正差不多。。。哪位大佬给区分一下QWQ。。


    好的,我把堆的<写反了。。又调了一个小时。。你能不能稳一点。。。。

    记录状态:所在位置u,油量c,花费w

    扩展状态:

    1.如果c+1<=C,就加1升油,为什么只加1升?因为如果这个状态不优,那它就会乖乖待在堆底下,不会多出现冗余状态;如果优,就在下一次扩展继续加油,所以并不会丢状态

    2.向所在连边(u,v)更新,如果可以跑过去,就尝试去更新v的状态。

    注意不同油量的状态要分开存,十分像分层图???

    #include<cstdio>
    #include<iostream>
    #include<queue>
    #include<cstring>
    #define R register int
    using namespace std;
    inline int g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    }
    int n,m,t,cnt;
    int fir[1010],w[1010],d[1010][110];
    bool vis[1010][110];
    struct edge{
        int v,nxt,w;
        #define vr(i) e[i].v
        #define nxt(i) e[i].nxt
        #define w(i) e[i].w
    }e[20010];
    inline void add(int u,int v,int ww) {vr(++cnt)=v,w(cnt)=ww,nxt(cnt)=fir[u],fir[u]=cnt;}
    struct node{int u,c,w; bool operator < (const node& y) const {return w>y.w;}
        node() {} node(int uu,int cc,int ww) {u=uu,c=cc,w=ww;} 
    };
    inline void bfs(int s,int t,int C) {
        memset(d,0x3f,sizeof(d)); memset(vis,0,sizeof(vis));
        priority_queue<node>q; d[s][0]=0; q.push(node(s,0,0));
        while(q.size()) {
            node tmp=q.top(); q.pop(); R u=tmp.u,c=tmp.c,tw=tmp.w; 
            vis[u][c]=true; 
            if(u==t) {printf("%d
    ",tw); return ;}
            if(c+1<=C&&!vis[u][c+1]&&d[u][c+1]>d[u][c]+w[u]) {d[u][c+1]=d[u][c]+w[u]; q.push(node(u,c+1,d[u][c+1]));}
            for(R i=fir[u];i;i=nxt(i)) { R v=vr(i),ew=w(i);
                if(c>=ew&&!vis[v][c-ew]&&tw<d[v][c-ew]) {
                    d[v][c-ew]=tw; q.push(node(v,c-ew,d[v][c-ew]));
                }
            }
        } printf("impossible
    ");
    }
    signed main() {
        n=g(); m=g(); for(R i=0;i<n;++i) w[i]=g();
        for(R i=1,u,v,w;i<=m;++i) u=g(),v=g(),w=g(),add(u,v,w),add(v,u,w);
        t=g(); while(t--) {R C=g(),s=g(),t=g(); bfs(s,t,C);}
    }

    2019.04.26

  • 相关阅读:
    LeetCode: 18. 4Sum
    LeetCode:15. 3Sum
    Leetcode:1. Two Sum
    tensorflow placeholder
    Tensorflow变量
    13.git的简单使用
    13.Django1.11.6文档
    12.python进程协程异步IO
    12.Flask-Restful
    12.Django思维导图
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10776823.html
Copyright © 2011-2022 走看看