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]<<" ";
}
求问什么原因。