NC22594 Rinne Loves Graph

分层图最短路,注意按照题意中的“穿过”的定义来模拟。

const int N=1e5+10;
struct Node
{
    int dis;
    int u,cnt;
    bool operator>(const Node &W) const
    {
        return dis>W.dis;
    }
};
vector<PII> g[N];
int dist[N][15];
bool danger[N];
bool vis[N][15];
int n,m,k;

void dijkstra()
{
    memset(dist,0x3f,sizeof dist);
    priority_queue<Node,vector<Node>,greater<Node> > heap;
    dist[1][0]=0;
    heap.push({0,1,0});

    while(heap.size())
    {
        int t=heap.top().u,cnt=heap.top().cnt;
        heap.pop();

        if(vis[t][cnt]) continue;
        vis[t][cnt]=true;

        int f=0;
        if(danger[t]) f=1;

        for(int i=0;i<g[t].size();i++)
        {
            int j=g[t][i].fi,w=g[t][i].se;
            if(cnt+f<=k && dist[j][cnt+f]>dist[t][cnt]+w)
            {
                dist[j][cnt+f]=dist[t][cnt]+w;
                heap.push({dist[j][cnt+f],j,cnt+f});
            }
        }
    }
}

int main()
{
    cin>>n>>m>>k;

    for(int i=1;i<=n;i++) cin>>danger[i];

    while(m--)
    {
        int a,b,c;
        cin>>a>>b>>c;
        g[a].pb({b,c});
        g[b].pb({a,c});
    }

    dijkstra();

    int res=INF;
    for(int i=0;i<=k;i++)
        res=min(res,dist[n][i]);
    if(res == INF) res=-1;
    cout<<res<<endl;

    //system("pause");
}
原文地址:https://www.cnblogs.com/fxh0707/p/14077168.html