萌新学习编程 5 年,样例没过求条
查看原帖
萌新学习编程 5 年,样例没过求条
1015780
newbieTroll楼主2025/8/30 23:21
#include<bits/stdc++.h>
using namespace std;
const int N=155,M=505;
struct Edge{
    int v,V,L;
};
struct Node{
    double d;
    int v,speed;
    friend bool operator < (Node x,Node y){
        return x.d>y.d;
    }
};
int n,m,d;
vector<Edge> G[N];
double dis[N][M];
bool S[N][M];
int pre[N][M][2];
void print(int now,int v){
    if(now!=1) print(pre[now][v][0],pre[now][v][1]);
    cout<<now-1<<" ";
    return ;
}
signed main(){
    cin>>n>>m>>d;
    int a,b,v,l;
    while(m--){
        cin>>a>>b>>v>>l;
        G[a+1].push_back({b+1,v+1,l+1});
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=500;++j) dis[i][j]=2e9;
    }
    dis[1][70]=0;
    priority_queue<Node> q;
    q.push({0,1,70});
    while(!q.empty()){
        int x=q.top().v,y=q.top().speed;
        q.pop();
        if(S[x][v]) continue;
        S[x][v]=1;
        for(auto [v,V,L]:G[x]){
            if(V==0){
                if(dis[v][y]>dis[x][y]+(double)L/y){
                    dis[v][y]=dis[x][y]+1.0*L/y;
                    pre[v][y][0]=x;
                    pre[v][y][1]=y;
                    q.push({dis[v][y],v,y});
                }
            }
            else{
                if(dis[v][V]>dis[x][y]+(double)L/V){
                    dis[v][V]=dis[x][y]+1.0*L/V;
                    pre[v][V][0]=x;
                    pre[v][V][1]=y;
                    q.push({dis[v][V],v,V});
                }
            }
        }
    }
    int x=0;
    for(int i=1;i<=500;++i){
        if(dis[d+1][i]>dis[d+1][x]) x=i;
    }
    print(d+1,x);
	return 0;
}
2025/8/30 23:21
加载中...