• BZOJ 3245 最快路线


    和道路升级差不多,只是用的spfa;

    十分有毒,在BZOJ上一直WA,对拍拍出来是一样的却告诉我不一样,然后发现自己把' '写成了‘’。。。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<vector>
    typedef long long LL;
    const int maxm=45000+299;
    const int maxn=299;
    const int INF=1e9+7;
    using namespace std;
    int ans,ecnt,n,m,t,u,v,lim,len,fir[maxn],nxt[maxm],to[maxm],val[maxm],li[maxm];
    int vis[200][550],prx[200][550],prv[200][550],xx,vv,as[maxn];
    double dp[200][550];
    struct node {
        int id,v;
        node(){}
        node(int id,int v):id(id),v(v){}
    }now;
    void add(int u,int v,int lim,int w) {
        nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v; val[ecnt]=w; li[ecnt]=lim;
        //nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u; val[ecnt]=w; li[ecnt]=lim;
    }
    void init() {
        scanf("%d%d%d",&n,&m,&t);
        for(int i=1;i<=m;i++) {
            scanf("%d%d%d%d",&u,&v,&lim,&len);
            add(u,v,lim,len);
        }
    }
    queue<node>que;
    void spfa() {
        memset(vis,0,sizeof(vis));
        memset(dp,127,sizeof(dp));
        dp[0][70]=0; 
        que.push(node(0,70)); 
        while(!que.empty()) {
            now=que.front(); 
            que.pop();
            int x=now.id,v=now.v;
            vis[x][v]=0;
            for(int i=fir[x];i;i=nxt[i]) {
                int y=to[i];
                if(li[i]&&dp[x][v]+(double)val[i]/li[i]<dp[y][li[i]]) {
                    dp[y][li[i]]=dp[x][v]+(double)val[i]/li[i];
                    prx[y][li[i]]=x; prv[y][li[i]]=v; 
                    if(!vis[y][li[i]]) {
                        vis[y][li[i]]=1;
                        que.push(node(y,li[i])); 
                    }
                }
                else if(!li[i]&&dp[x][v]+(double)val[i]/v<dp[y][v]){
                    dp[y][v]=dp[x][v]+(double)val[i]/v;
                    prx[y][v]=x; prv[y][v]=v;
                    if(!vis[y][v]) {
                        vis[y][v]=1;
                        que.push(node(y,v)); 
                    }    
                }
            }
         }
    }
    void work() {
        spfa();
        for(int i=0;i<=500;i++) if(!vv||dp[t][i]<dp[t][vv]) vv=i;
        xx=t; 
        for(;;) {
            as[++as[0]]=xx;
            if(xx==0) break;
            int tx=prx[xx][vv],tv=prv[xx][vv];
            xx=tx,vv=tv;
        } 
        for(int i=as[0];i>1;i--) 
         printf("%d ",as[i]);
        printf("%d
    ",as[1]);
    }
    int main()
    {
        init();
        work();
        return 0;
    }
    View Code
  • 相关阅读:
    20190425 发现了一家不错的咖啡店---半生咖啡
    20190425 这个。。。
    20190425 看数据统计和数据挖掘让我写了一篇杂文
    20190424 数据仓库 维度建模(一)
    20190423 PowerDesigner 数据库模型快速建立
    Xshell安装后,使用的优化
    Linux系统安装和网络配置
    Linux发展史-简简简易版
    服务器硬件
    git 常用命令
  • 原文地址:https://www.cnblogs.com/Achenchen/p/7559794.html
Copyright © 2020-2023  润新知