zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    POI 给单元格添加批注
    Linux下Mysql的odbc配置(修改网上博文)
    Linux下mysql实现类似于Sqlser的Profiler的访问记录监听功能
    windows下部署icescrum
    sql server2008查询会话的Ip地址、用户登录名、登录机器名
    error while loading shared libraries的解決方法
    做个标记,指针的指针的应用
    微信架构(转)
    网络监控netstat(转)
    大话MVC模式
  • 原文地址:https://www.cnblogs.com/Achenchen/p/7559794.html
Copyright © 2011-2022 走看看