子任务1全T92 pts 求助qwq
查看原帖
子任务1全T92 pts 求助qwq
923403
FallingFYC_楼主2025/1/27 13:47
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define REV(i,a,b) for(int i=a;i>=b;i--)
#define psbk push_back
#define mkp make_pair
#define endl '\n'
using namespace std;
const int N=1e5+5;
const double INF=1e18;
struct Edge{int v,w,d;};
struct Node{
    int id,fl;
    double d;
    bool operator < (const Node &a) const{
        if(fl==a.fl)return d>a.d;
        return fl>a.fl;
    }
};
int n,m,k,h;
double dis[N*70];
bool bk[N*70];
vector<Edge>e[N*70];
int id(int p,int f){return f*n+p;}
void dfs(int u){
    bk[u]=1;
    if(u==h)return;
    for(Edge p:e[u])
        if(!bk[p.v])dfs(p.v);
}
double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr){
    FOR(i,0,(k+1)*n+10)e[i].clear();
    memset(bk,0,sizeof bk);
    n=N,m=M,k=min(K,68),h=H;
    FOR(i,0,m-1){
        e[x[i]].psbk({y[i],c[i],1});
        e[y[i]].psbk({x[i],c[i],1});
    }
    dfs(0);
    if(!bk[h])return -1;
    FOR(i,0,n+10)e[i].clear();
    FOR(i,0,m-1)
        FOR(j,0,k){
            if(x[i]!=h){
                e[id(x[i],j)].psbk({id(y[i],j),c[i],1});
                if(arr[y[i]]==2&&j<k)e[id(x[i],j)].psbk({id(y[i],j+1),c[i],2});
            }
            if(y[i]!=h){
                e[id(y[i],j)].psbk({id(x[i],j),c[i],1});
                if(arr[x[i]]==2&&j<k)e[id(y[i],j)].psbk({id(x[i],j+1),c[i],2});
            }
        }
    FOR(i,0,(k+1)*n+10)dis[i]=INF;
    priority_queue<Node> q;
    q.push({0,0,0}),dis[0]=0;
    FOR(i,0,n-1)
        if(!arr[i]&&bk[i])q.push({i,0,0}),dis[i]=0;
    memset(bk,0,sizeof bk);
    while(!q.empty()){
        Node u=q.top();
        q.pop();
        int id=u.id;
        if(bk[id])continue;
        bk[id]=1;
        for(auto i:e[id]){
            int v=i.v,w=i.w,d=i.d;
            if(dis[v]>(dis[id]+w)*1.0/d){
                dis[v]=(dis[id]+w)*1.0/d;
                if(!bk[v])q.push({v,v/n,dis[v]});
            }
        }
    }
    double ans=INF;
    FOR(i,0,k)ans=min(ans,dis[id(h,i)]);
    return ans;
}
/*
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin>>T;
    while(T--){
        cin>>n>>m>>k>>h;
        vector<int> arr(n);
        FOR(i,0,n-1)cin>>arr[i];
        vector<int> x(m),y(m),c(m);
        FOR(i,0,m-1)cin>>x[i]>>y[i]>>c[i];
        cout<<solve(n,m,k,h,x,y,c,arr)<<endl;
    }
    return 0;
}
*/

record

2025/1/27 13:47
加载中...