代码如下,邻接表存图,尝试过三种方法,包括使用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] << " ";
}
}