根本不需要分层图,其实是dijkstra模板题


思路

让我们求从 s 到 t 的最短路
关键点在于建边 有手就行

很简单一题,不废话了,代码如下

Code

#include <bits/stdc++.h>

using namespace std;

const int N = 1e3+10;

bool st[N];
int a[N];
int dist[N];
int g[N][N];
int n,m,s,t;

int dijkstra(){
    memset(dist,0x3f,sizeof dist);
    dist[s]=0;

    for(int i=0;i<n;i++) {
        int t=-1;
        for(int j=1;j<=n;j++) if(!st[j]&&(t==-1||dist[t]>dist[j])) t=j;

        st[t]=true;
        for(int j=1;j<=n;j++) dist[j]=min(dist[j],dist[t]+g[t][j]);
    }

    return dist[t]==0x3f3f3f3f?-1:dist[t];
}

int main(){
    cin>>n>>m>>s>>t;
    memset(g,0x3f,sizeof g);

    //  这里我以为会超时,结果并没有,数据有点水了
    while(m--){
        int p1,p2,num;
        cin>>p1>>p2>>num;
        for(int i=1;i<=num;i++) cin>>a[i];

         for(int i=1;i<=num;i++) for(int j=i+1;j<=num;j++){   // 建边
             int x=a[i],y=a[j];
             if(abs(i-j)==1) g[x][y]=g[y][x]=min(g[x][y],p1+p2);
             else g[x][y]=g[y][x]=min(g[x][y],p1+abs(i-j)*p2);
         } 
    }

    cout<<dijkstra()<<endl;

    return 0;
}