题解 luoguP1772 【[ZJOI2006]物流运输】

[ZJOI2006]物流运输

https://ac.nowcoder.com/acm/problem/20469

模拟赛居然考了这道题,前一天刚看过,结果看了舍不得(不会)做,结果只骗到30pt

讲课人:很容易想到最短路+(我靠一点都不容易)

模拟赛后分析,才知道是处理出第i天到第j天都走同一条最短路的花费为

然后进行表示前i天的最小花费

转移方程很好想:,预处理要赋值为

方程的意思,即在第天改变路线,第天~第天都走同一条路线

那么如何处理?

很简单,对于每一个,先把天之间封闭的码头全部设为不可走,跑一遍最短路即可,初值为无穷

数据辣么小,跑几遍以及跑什么都没关系嘤嘤嘤

那我们就十分愉♂快的解决了此题~

愉♂快的提交了然后居然只有90pt

原谅我无耻的打开题解

啊啊啊原来要开 (明明数据辣么小)

献上代码:

#include<bits/stdc++.h>
#define soo (1e8)
#define ll long long
using namespace std;
int d,cnt,head[25],dis[25],vis[25],cant_vis[25];
ll co[105][105],dp[105];
int n,m,k,ee,cl[25][105];
struct Edge{
    int v,nx,s;
}e[10005];
inline int read(){
    int ret=0,ff=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-') ff=-ff;ch=getchar();}
    while(isdigit(ch)){ret=(ret<<3)+(ret<<1)+ch-'0';ch=getchar();}
    return ret*ff;
}
void add(int x,int y,int z){
    e[++cnt].v=y;
    e[cnt].s=z;
    e[cnt].nx=head[x];
    head[x]=cnt;
}
void spfa(){//爱跑什么跑什么
    for(int i=1;i<=m;i++) dis[i]=soo,vis[i]=0;
    queue<int> q;
    dis[1]=0;
    q.push(1);
    while(!q.empty()){
        int x=q.front();
        q.pop();
        vis[x]=0;
        for(int i=head[x];i;i=e[i].nx){
            int v=e[i].v;
            if(cant_vis[v]) continue;
            if(dis[v]>dis[x]+e[i].s){
                dis[v]=dis[x]+e[i].s;
                if(!vis[v]){
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
}
signed main(){
    n=read(),m=read(),k=read(),ee=read();
    for(int i=1;i<=ee;i++){
        int x=read(),y=read(),z=read();
        add(x,y,z);
        add(y,x,z);
    }
    d=read();
    for(int i=1;i<=d;i++){
        int t=read(),x=read(),y=read();
        for(int j=x;j<=y;j++) cl[t][j]=1;
    }
    //cl[i][j]表示第i个码头在第j天不能走
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            memset(cant_vis,0,sizeof(cant_vis));
            for(int r=i;r<=j;r++)
                for(int l=1;l<=m;l++)
                    if(cl[l][r]) cant_vis[l]=1;
            spfa();
            co[i][j]=dis[m];
        }
    memset(dp,0x7f,sizeof(dp));
    for(int i=1;i<=n;i++){
        dp[i]=(ll)co[1][i]*i;
        for(int j=i-1;j>=0;j--)
            dp[i]=min(dp[i],dp[j]+co[j+1][i]*(i-j)+k);
    }
    printf("%lld",dp[n]);
    return 0;
}
全部评论

相关推荐

原来已经一年了,因为没有加任何实验室没有学长学姐带,再一次偶然的机会下刷到我们学校的牛肉哥,和他聊天之后发现他也没加实验室能进大厂,我就燃起了希望,去年大概&nbsp;4&nbsp;月份找好路线&nbsp;零基础&nbsp;开始学&nbsp;5&nbsp;月背八股和开始刷算法很难受&nbsp;7-8&nbsp;月焦虑躯体化害怕找不到实习&nbsp;9&nbsp;月找到一家像样的小厂去实习了&nbsp;4&nbsp;个月大三上期末考试结束之后&nbsp;1&nbsp;月份回来边实习边准备工作压力很大&nbsp;当时只有字节、百度、商汤的面试,字节三面挂了,百度&nbsp;oc,商汤&nbsp;二面挂(差评&nbsp;无效面试),之后来深圳百度实习之后还是觉得不甘心一直没把算法和八股扔下一直在准备,百度实习的时候&nbsp;mt&nbsp;交给我一个特别重要的工作数据库迁移(特别感谢&nbsp;mt&nbsp;,这个需求学到了很多东西处理了一堆线上问题),本来看着暑期他们面试都很困难,然后听说百度要涨实习薪资(然而&nbsp;5&nbsp;月并没有涨),就想着留在百度吧也懒得面试了,4&nbsp;月&nbsp;20&nbsp;多的时候字节&nbsp;hr&nbsp;打电话约面问我要不要尝试一下询问了&nbsp;1&nbsp;月份三面为啥会挂有没有学习&nbsp;ai&nbsp;知识(因为字节这边后端岗位偏&nbsp;ai),我来到百度之后全面拥抱&nbsp;AI&nbsp;也认识了我的好兄弟&nbsp;X&nbsp;哥,他在百度&nbsp;XX&nbsp;部门&nbsp;Agent&nbsp;实习,他属于是我&nbsp;Agent&nbsp;的启蒙老师,来百度之后一直在了解&nbsp;AI&nbsp;这一块,我就接受了字节的面试,一面的时候&nbsp;20&nbsp;分钟实习拷打然后突然说&nbsp;30&nbsp;分钟代码考核我心就凉了以为是&nbsp;kpi,算法题是手撕高并发安全下的令牌桶限流器,我写了整整&nbsp;80&nbsp;多行代码最后也写出来了,但是从来没看到过出这种题能&nbsp;oc&nbsp;的我也就不管了,后边面试也是很顺利但是流程有点长可能一直在横向吧总结结果是好的!!!感谢这一年努力的自己和遇到的各位互联网大佬分享的知识!!!ps&nbsp;图二纯感慨&nbsp;(觉得🍬请不要喷我)欢迎大家一起交流学习呀!!!!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务