Dijkstra+堆优化#1AC#3WA其余MLE 求调
查看原帖
Dijkstra+堆优化#1AC#3WA其余MLE 求调
1357737
xialingn楼主2024/8/14 16:58

代码如下,邻接表存图,尝试过三种方法,包括使用vector的case1和case2,均MLE。 救救可怜孩子吧,可能犯了什么愚蠢的错误我也不知道

#include<iostream>
#include<queue>
#include<utility>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn = 100005;
const int maxm = 500005;
const int INF = 0x3f3f3f3f;

typedef pair<int, int> pair_v;
priority_queue<pair_v, vector<pair_v>, greater<pair_v>> heap;

int num_edge=0, head[maxm];
struct Edge
{
  int next,to,dis;  //head[u], to, w(u->to)
}edge[maxm]; //结构体表示静态邻接表
void addedge(int from,int to,int dis) //邻接表建图
{
  edge[++num_edge].next=head[from]; //链式存储下一条出边
  edge[num_edge].to=to; //当前节点编号
  edge[num_edge].dis=dis; //本条边的距离
  head[from]=num_edge; //记录下一次的出边情况
}
/*case1
struct Edge{
    int end_v;
    int adj_w;
};
vector<Edge> adj[maxn];
*/
/*case2
vector<pair_v> adj[maxn];
*/
int dist[maxn], key[maxn]; 
bool disted[maxn]; 


void dijkstra(int s) {
    key[s] = 0;
    heap.push({key[s], s});
    while (!heap.empty()) {
        int v = heap.top().second;
        dist[v] = key[v];
        disted[v] = true;
        heap.pop();

        for (int i=head[v]; i; i=edge[i].next) {
            int w=edge[i].to;
            if(disted[w]) continue; 
            key[w] = min(dist[v] + edge[i].dis, key[w]);
            heap.push({key[w], w});
        }
        /*case2
        for (pair_v w : adj[v]) {
            if(disted[w.first]) continue; 
            key[w.first] = min(dist[v] + w.second, key[w.first]);
            heap.push({key[w.first], w.first});
        }
        */
        /*case1
        for (Edge w : adj[v]) {
            if(disted[w.end_v]) continue;
            key[w.end_v] = min(dist[v] + w.adj_w, key[w.end_v]);
            heap.push({key[w.end_v], w.end_v});
        }
        */
    }

}


int main(void) {
    int n, m, s; 
    cin >> n >> m >> s;
    int x, y, w;
    for (int i=0; i < m; i ++) {
        cin >> x >> y >> w;
        addedge(x, y, w);
        /*
        adj[x].push_back({y, w});
        */
    }
    memset(dist, 0, sizeof(dist));
    memset(key, INF, sizeof(key));
    memset(disted, false, sizeof(disted));
    dijkstra(s);
    for (int i=1; i <= n; i ++) {
        cout << dist[i] << " ";
    }
    
}

2024/8/14 16:58
加载中...