BZOJ 3245 最快路线

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

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

#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\n",as[1]);
}
int main()
{
    init();
    work();
    return 0;
}
View Code

 

posted @ 2017-09-20 09:21  啊宸  阅读(181)  评论(0编辑  收藏  举报