社区讨论
dijkstra 邻接表 链式前向星性能差距大且TLE
P4779【模板】单源最短路径(标准版)参与者 3已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @m4o08wor
- 此快照首次捕获于
- 2024/12/14 17:59 去年
- 此快照最后确认于
- 2025/11/04 12:51 4 个月前
dijkstra
邻接表做法:开O2 84pts 不开O2 48pts
CPP#include <bits/stdc++.h>
#define int long long
using namespace std;
struct edge {
int v,w;
};
struct pt {
int length,num;
friend bool operator<(pt a,pt b) {
return a.length > b.length;
}
};
vector<edge> mp[100100];
int vis[100100],dist[100100];
int n,m,s;
int u,v,w;
void dijkstra(int st) {
priority_queue<pt> q;
q.push({0,st});
for (int i = 1; i <= n; i++) {
dist[i] = INT_MAX;
}
dist[st] = 0;
while(q.size() != 0) {
pt now = q.top();
q.pop();
vis[now.num] = 1;
for (auto t:mp[now.num]) {
if (vis[t.v] == 1) continue;
//printf(" dist[%lld]= %lld t.w = %lld dist[t.v] = %lld\n",now.num,dist[now.num],t.w ,dist[t.v]);
if (dist[now.num] + t.w < dist[t.v]) {
dist[t.v] = dist[now.num] + t.w;
//printf("update dist[%lld] = dist[%lld]:%lld + %lld\n",t.v,now.num,dist[now.num],t.w);
q.push({dist[t.v],t.v});
}
//printf("now = [%lld,%lld] t = [%lld,%lld] dist[%lld]= %lld\n",now.length,now.num,t.v,t.w,t.v,dist[t.v]);
}
}
}
signed main() {
cin >> n >> m >> s;
for (int i = 1; i <= m; i++) {
cin >> u >> v >> w;
mp[u] .push_back({v,w});
}
dijkstra(s);
for (int i= 1;i<= n;i++)
{
cout << dist[i]<< " ";
}
}
链式前向星 都是48pts
CPP#include <bits/stdc++.h>
#define int long long
using namespace std;
struct edge
{
int v,w,next;
}e[200010];
struct pt
{
int num,d;
friend bool operator<(pt a,pt b)
{
return a.d > b.d;
}
};
int cnt,head[100010],vis[100010],dist[100010];
int u,v,w;
int n,m,s;
void add(int u,int v,int w)
{
e[++cnt].v = v;
e[cnt].w = w;
e[cnt].next = head[u];
head[u] = cnt;
}
void dijkstra(int st)
{
for (int i = 1;i <= n;i++)
{
dist[i] = LLONG_MAX;
}
dist[st] = 0;
priority_queue<pt > q;
q.push({st,dist[st]});
while (q.size())
{
pt now = q.top();
q.pop();
vis[now.num] = 1;
//printf("now = %lld",now);
for (int i = head[now.num];i;i = e[i].next)
{
if (vis[e[i].v] == 0)
{
if (dist[now.num] + e[i].w < dist[e[i].v])
{
dist[e[i].v] = dist[now.num] + e[i].w;
q.push({e[i].v,dist[e[i].v]});
//printf("\tnow = %lld v = %lld (now,v) = %lld dist[now] = %lld dist[v] = %lld\n",now,e[i].v,e[i].w,dist[now],dist[e[i].v]);
}
}
}
}
}
signed main()
{
// freopen("P4779_3.in","r",stdin);
// freopen("P4779.out","w",stdout);
cin >> n >> m >> s;
for (int i = 1;i <= m;i++)
{
cin >> u >> v >> w;
add(u,v,w);
}
dijkstra(s);
for (int i = 1;i <= n;i++)
{
cout << dist[i] << " ";
}
}
希望有dalao看看
回复
共 11 条回复,欢迎继续交流。
正在加载回复...