社区讨论
为啥spfa会超时,最坏不就是o(nm)吗
P1629邮递员送信参与者 6已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 11 条
- 当前快照
- 1 份
- 快照标识符
- @lo8gg4sc
- 此快照首次捕获于
- 2023/10/27 18:12 2 年前
- 此快照最后确认于
- 2023/10/27 18:12 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N],b[N],c[N];
int h[N],e[N],ne[N],idx,w[N];
int dist[N];
int n,m;
bool st[N];
void add(int x,int y,int z)
{
w[idx]=z,e[idx]=y,ne[idx]=h[x],h[x]=idx++;
}
void spfa()
{
memset(dist,0x3f,sizeof dist);
dist[1]=0;
queue<int>q;
q.push(1);
st[1]=true;
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])
{
q.push(j);
st[j]=true;
}
}
}
}
}
int main()
{
cin>>n>>m;
memset(h, -1, sizeof h);
for(int i=1;i<=m;i++)
{
cin>>a[i]>>b[i]>>c[i];
add(a[i],b[i],c[i]);
}
spfa();
int ans=0;
for(int i=2;i<=n;i++) ans+=dist[i];
memset(h, -1, sizeof h);
for(int i=1;i<=m;i++)
{
add(b[i],a[i],c[i]);
}
spfa();
for(int i=2;i<=n;i++) ans+=dist[i];
cout<<ans<<endl;
return 0;
}
回复
共 11 条回复,欢迎继续交流。
正在加载回复...