• 网络流24题之汽车加油行驶问题


    题目链接

    戳我

    (Solution)

    网络流是什么?可以吃吗?

    这道题明显不需要网络流啊,直接暴力(bfs)即可

    令f[x][y][k]表示在(x,y)时还剩下(k)步的最小花费

    然后向四周扩展即可

    (Code)

    #include<bits/stdc++.h>
    #define rg register
    #define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
    using namespace std;
    int read(){
        int x=0,f=1;char c=getchar();
        while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
        while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
        return f*x;
    }
    int f[111][111][21];
    struct node {
        int x,y,k,v;
    };
    int fx[6]={0,0,0,-1,1};
    int fy[6]={0,1,-1,0,0};
    int fv[6],A,C,n,K,bj[111][111];
    queue<node> q;
    void bfs(){
        q.push((node){1,1,K,0});
        memset(f,127,sizeof(f));
        while(!q.empty()){
            node now=q.front();
            q.pop();
            if(now.v>=f[now.x][now.y][now.k]) continue;
            f[now.x][now.y][now.k]=now.v;
            for(int i=1;i<=4;i++) {
                int x=now.x+fx[i],y=now.y+fy[i];
                if(x<1||y<1||x>n||y>n) continue;
                if(bj[now.x][now.y]) q.push((node){x,y,K-1,now.v+A+fv[i]});
                else if(!now.k) q.push((node){x,y,K-1,now.v+C+A+fv[i]});
                else q.push((node){x,y,now.k-1,now.v+fv[i]}); 
            }
        }
    }
    int main(){
        n=read(),K=read(),A=read(),fv[2]=fv[3]=read(),C=read();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                bj[i][j]=read();
        bfs();
        int minx=2147483547;
        for(int i=0;i<=K;i++)
            minx=min(minx,f[n][n][i]);
        cout<<minx<<endl;
        return 0;
    }
    
  • 相关阅读:
    spark shuffle过程分析
    Android实现网络多线程断点续传下载
    幻世(OurDream)TM 2D图形引擎开通捐赠渠道
    MDA模型定义及扩展
    STL在迭代的过程中,删除指定的元素
    c# POST和GET方式通过server地址提交数据
    Python爬虫抓取csdn博客
    Word Ladder II
    HDU 4183 Pahom on Water(最大流SAP)
    poj1011 Sticks
  • 原文地址:https://www.cnblogs.com/hbxblog/p/10502112.html
Copyright © 2020-2023  润新知