题解 | #小雨坐地铁#

小雨坐地铁

https://ac.nowcoder.com/acm/problem/26257

根本不需要分层图,其实是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;
}
全部评论
学到了,打卡感谢
点赞 回复 分享
发布于 2021-11-17 11:32
这建边tql
点赞 回复 分享
发布于 2021-08-15 17:28

相关推荐

06-27 15:15
长安大学 Java
哈哈哈,你是老六:这种就是培训机构骗钱的
点赞 评论 收藏
分享
06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
评论
6
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务