鴎羽 2023-12-13 15:45 采纳率: 33.3%
浏览 1
已结题

牛客刷题遇到的问题,最短路径,NC14292

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

img

img

不就是最短路问题么,看了题解也没看懂,为什么还要分开来算,直接求最短路哪里不对啊o((>ω< ))o,下面是自己写的迪杰斯特拉。


#include<bits/stdc++.h>
#include<iostream>
#include<queue>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int N = 52502;
const int INF = 1e9+10;
int h[N],ne[N],e[N],w[N],idx;
int n,m,q;
void add(int a,int b,int c){
    w[idx] = c;
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
}
int dist[N];
bool st[N];
int dj(int s,int se){
    memset(st,0,sizeof st);
    
    for(int i=0;i<=N;i++){
        dist[i] = INF;
    }
    priority_queue<PII,vector<PII>,greater<PII> > heap;
    dist[s] = 0;
    heap.push({0,s});
    while(heap.size()){
        bool flag = true;    
        for(int i =1;i<=n;i++){
            if(!st[i]){
                flag = false ;
                break;
            }
        }
        if(flag) break;
        auto t = heap.top();
        heap.pop();
        int ver = t.second , dis = t.first;
        if(st[ver]) continue;
        st[ver] = true;
        for(int i=h[ver] ;i !=- 1; i = ne[i]){
            
            int j=e[i];
            if(dist[j]>dis+w[i]){
                dist[j] = dis+w[i] ;
                heap.push({dist[j],j});
            }
        }
    }
    if(dist[se] == INF) return -1;
    else return dist[se];
}

int main(){
    memset(h,-1,sizeof h);
    cin>>n>>m;
    for(int i=1 ; i<=n;i++){//无传送门
        int k;
        cin >> k;
        if(i==n){
            add(n,1,k);
            add(1,n,k);
        }
        else{
            add(i,i+1,k);
            add(i+1,i,k);
        }
    }
    for(int i=1;i<=m;i++){
        int u,v,w1;
        cin>>u>>v>>w1;
        if(u == v) continue;
        add(u,v,w1);
        add(v,u,w1);
    }
    scanf("%d",&q);
    while(q--){
        int p1,p2;
        cin>>p1>>p2;
        cout<<dj(p1,p2)<<endl;
    }
//     for(int i=h[3];i != -1 ; i = ne[i]){
//         cout<<e[i]<<" ";
//     }
//     cout<<dj(4,3);
    return 0;
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 12月21日
    • 创建了问题 12月13日

    悬赏问题

    • ¥20 前端 二进制文件流图片转化异常
    • ¥15 github上的这个C语言项目如何跑起来
    • ¥15 java 判断某个数 区间是否存在
    • ¥15 appium控制多个雷电模拟器问题
    • ¥15 C# iMobileDevice
    • ¥15 谁会做这个啊#ensp#Boson NetSim
    • ¥15 如何编写针对TPS6503320FRGE型号的电源管理芯片的编程代码?
    • ¥15 设计简单目录管理系统,要满足以下内容
    • ¥15 关于九十度混合耦合器信号分析问题
    • ¥15 Cesm如何关闭不用的模块呢