模拟队列
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N =2510,M=6200*2+10;
int n,m,S,T;
int h[N],e[M],ne[M],w[M],idx;
int dist[N],q[N];
bool st[N];
void add(int a,int b,int c)
{
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void spfa()
{
memset(dist,0x3f,sizeof dist);
dist[S]=0;
int hh=0,tt=1;
q[0]=S;
st[S]=true;
while(hh!=tt)
{
int t=q[hh++];
if(hh==N) hh=0; 出队
st[t]=false;
for(int i=h[t];~i;i=ne[i])
{
int j=e[i];
if(dist[j]>dist[t]+w[i])
{
dist[j]=dist[t]+w[i];
if(!st[j])
{
q[tt++]=j;
if(tt==N) tt=0;
//防止队列出界,让队尾为0;
st[j]=true;
}
}
}
}
}
int main()
{
cin>>n>>m>>S>>T;
memset(h,-1,sizeof h);
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c),add(b,a,c);
}
spfa();
cout<<dist[T]<<endl;
return 0;
}
STL
stl中的queue是循环队列
#include<bits/stdc++.h>
using namespace std;
const int N = 2000010;
int n, m, start, en;
int h[N], e[N], ne[N], w[N], idx;
int dist[N];
bool st[N];
void add(int a, int b, int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}
int spfa()
{
memset(dist, 0x3f, sizeof dist);
dist[start] = 0;
st[start] = true;
queue<int> q;
q.push(start);
while(q.size())
{
int t = q.front();
q.pop();
st[t] = false;
for(int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if(dist[j] > dist[t] + w[i])
{
dist[j] = dist[t] + w[i];
if(!st[j])
{
st[j] = true;
q.push(j);
}
}
}
}
return dist[en];
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m >> start >> en;
for(int i = 0; i < m; i ++)
{
int a, b, c;
cin >> a >> b >> c;
add(a, b, c);
add(b, a, c);
}
int t = spfa();
cout << t << endl;
return 0;
}
大佬大佬 这个为什么要用循环队列呀。有点搞不懂欸,总共不是只有六千多条无向边吗 所以点的距离的更新次数最大也不会超过一万二千多吧。。所以队列的范围是不是可以直接设成一万三,楼楼觉得这么计算可以嘛。
应该是可以的,你可以试着提交以下
过了谢谢大佬回复hhh
在我认为所有的spfa和dijkatra等算法,基本上都是由dfs和bfs直接变形而来的。所有只要记住dfs和bfs是怎么写的就可以了