关于本题写法
  • 板块P1266 速度限制
  • 楼主lanretE
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/18 11:48
  • 上次更新2023/10/27 07:02:33
查看原帖
关于本题写法
398190
lanretE楼主2022/10/18 11:48

rt,第一篇题解里面那个既用堆又写的跟 spfa 一样的写法照着写下来能过,但是我把它改的和正常 dij 一样就会 WA,有没有神仙看看为啥还是说我脑抽写错了

#include<bits/stdc++.h>
using namespace std;
int n,m,d;
const int N=150100;
int ver[N],ne[N],he[N],speed[N],len[N],tot;
double dis[1010][1010];
bool vis[1010][1010];
void add(int u,int v,int sp,int l){
    ver[++tot]=v;
    len[tot]=l; speed[tot]=sp;
    ne[tot]=he[u];
    he[u]=tot;
}
struct node{
    int sp,u,t;
    bool operator <(const node &a)const{
        return t>a.t;
    }
}from[1010][1010];
void print(int x,int sp){
    if(x==1) return;
    print(from[x][sp].u,from[x][sp].sp);
    cout<<x-1<<' ';
}
priority_queue<node>q;
void dij(){
    q.push({70,1,0});
    for(int i=1;i<=n+1;++i)
        for(int j=1;j<=1000;++j) dis[i][j]=1e9+10;
    dis[1][70]=0;
    while(!q.empty()){
        node h=q.top(); q.pop();
        int last_v=h.sp,u=h.u,t=h.t;
        if(vis[u][last_v]) continue; vis[u][last_v]=1;
        for(int i=he[u];i;i=ne[i]){
            int v=ver[i],now_v=speed[i];
            if(now_v){
                if(vis[v][now_v]) continue;
                if(dis[v][now_v]>dis[u][last_v]+(double)len[i]/(double)now_v){
                    dis[v][now_v]=dis[u][last_v]+(double)len[i]/(double)now_v;
                    from[v][now_v].u=u,from[v][now_v].sp=last_v;
                    // if(vis[v][now_v]) continue; vis[v][now_v]=1;
                    q.push({now_v,v,dis[v][now_v]});
                }
            }
            else{
                now_v=last_v;
                if(vis[v][now_v]) continue;
                if(dis[v][now_v]>dis[u][last_v]+(double)len[i]/(double)now_v){
                    dis[v][now_v]=dis[u][last_v]+(double)len[i]/(double)now_v;
                    from[v][now_v].u=u,from[v][now_v].sp=last_v;
                    // if(vis[v][now_v]) continue; vis[v][now_v]=1;
                    q.push({now_v,v,dis[v][now_v]});
                }
            }
        }
    }
    int id=0; dis[d][id]=1e9+10;
    for(int i=1;i<=1000;++i)
        if(dis[d][id]>=dis[d][i] && dis[d][i]!=1e9+10) id=i;
    cout<<0<<' ';
    print(d,id);
    // cout<<66;
}
int main(){
    cin>>n>>m>>d; ++d;
    while(m--){
        int u,v,sp,l;
        cin>>u>>v>>sp>>l;
        add(u+1,v+1,sp,l);
    }
    dij();
    return 0;
}
2022/10/18 11:48
加载中...