堆优Dijkstra
  • 板块学术版
  • 楼主Escapism
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/10/6 16:27
  • 上次更新2023/11/2 15:13:38
查看原帖
堆优Dijkstra
361505
Escapism楼主2023/10/6 16:27

RT,这个蒟蒻在赛前回来复习模板。

这是我在一年前的代码,可以AC

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <utility>
#include <queue>
using namespace std;
const int N = 100010, INF = 0x3f3f3f3f;
int d[N];
int n;
struct Edge{
    int to, w;
};
vector<Edge> vec[N];
typedef pair<int, int> P;

void Dijkstra(int s) {
    priority_queue<P, vector<P>, greater<P> > pq;
    memset(d, INF, sizeof(d));
    d[s] = 0;
    pq.push(make_pair(0, s));
    while (!pq.empty()) {
        P p = pq.top();
        int u = p.second;
        pq.pop();
        if (d[u] < p.first) continue;
        for (int i = 0; i < vec[u].size(); i++) {
            int v = vec[u][i].to, w = vec[u][i].w;
            if (d[u] + w < d[v]) {
                d[v] = d[u] + w;
                pq.push(make_pair(d[v], v));
            }
        }
    }
}

int main() {
    int m, s;
    scanf("%d %d %d", &n, &m, &s);
    for (int i = 0; i < m; i++) {
        int u, v, w;
        scanf("%d %d %d", &u, &v, &w);
        vec[u].push_back((Edge){v, w});
    }
    Dijkstra(s);
    for (int i = 1; i <= n; i++) {
        printf("%d ", d[i]);
    }
    return 0;
}

我刚刚打完一个板子,只不过用的是结构体而不是pair,然而它TLE了。

#include<bits/stdc++.h>
using namespace std;

int n,m,s;
const int MAXN = 1e5 + 5,INF = 0x3f3f3f3f3f;
int d[MAXN];
struct Node{
	int to,w;
	bool operator > (const Node &a) const{
		return to > a.to;
	}
};
vector<Node> G[MAXN];

void Dij(int s){
	priority_queue<Node,vector<Node>,greater<Node> > q;
	for (int i = 1;i <= n;i++) d[i] = INF;
	d[s] = 0;
	q.push(Node{s,0});
	while(!q.empty()){
		Node tmp = q.top();
		q.pop();
		int x = tmp.to,y = tmp.w;
		if (d[x] < y) continue;
		for (int i = 0;i < G[x].size();i++){
			int u = G[x][i].to,w = G[x][i].w;
			if (d[u] > d[x] + w){
				d[u] = d[x] + w;
				q.push(Node{u,d[u]});
			}
		}
	}
}

int main(){
	cin>>n>>m>>s;
	for (int i = 1;i <= m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		G[u].push_back(Node{v,w});
	}
	Dij(s);
	for (int i = 1;i <= n;i++) cout<<d[i]<<" ";
}

求问什么原因。

2023/10/6 16:27
加载中...