题目来源
洛谷P3371 【模板】单源最短路径
https://www.luogu.org/problem/show?pid=3371
洛谷P1359 租用游艇
https://www.luogu.org/problem/show?pid=1359
思路
SPFA模板题
用被更新(缩短)了到S点的距离的点pos更新pos可到达的点到S点的距离
队列优化
代码(C++)[【模板】单源最短路径]
#include <cstdio>
#include <queue>
#include <bitset>
using namespace std;
bitset<10010> in; queue<int> q;
int n,m,s,u,v,w,cnt=0,pos,k,dis[10010];
int he[10010],en[500010],ne[500010],len[500010];
inline void add();
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;++i)
scanf("%d%d%d",&u,&v,&w),add();
for(int i=1;i<=n;++i)
dis[i]=2147483647;
dis[s]=0; in[s]=1; q.push(s);
while(!q.empty())
{
pos=q.front(); q.pop(); in[pos]=0;
k=he[pos];
while(k!=0)
{
if(dis[pos]+len[k]<dis[en[k]])
{
dis[en[k]]=dis[pos]+len[k];
if(in[en[k]]==0)
q.push(en[k]);
in[en[k]]=1;
}
k=ne[k];
}
}
for(int i=1;i<=n;++i)
printf("%d ",dis[i]);
return 0;
}
inline void add()
{
++cnt;
en[cnt]=v;
len[cnt]=w;
ne[cnt]=he[u];
he[u]=cnt;
}
代码(C++)[租用游艇]
#include <cstdio>
#include <queue>
#include <bitset>
using namespace std;
bitset<210> in; queue<int> q;
int n,s,u,v,w,cnt=0,pos,k;
int he[210],he1[210],dis[210],ans=0;
struct way{int en,ne,len;}p[40010];
inline void add();
int main()
{
scanf("%d",&n);
for(u=1;u<=n;++u)
{
dis[u]=2147483647;
for(v=u+1;v<=n;++v)
scanf("%d",&w),add();
}
s=1; dis[s]=0; in[s]=1; q.push(s);
while(!q.empty())
{
pos=q.front(); q.pop(); in[pos]=0;
k=he[pos];
while(k!=0)
{
if(dis[pos]+p[k].len<dis[p[k].en])
{
dis[p[k].en]=dis[pos]+p[k].len;
if(in[p[k].en]==0)
q.push(p[k].en);
in[p[k].en]=1;
}
k=p[k].ne;
}
}
printf("%d",dis[n]);
return 0;
}
inline void add()
{
p[++cnt].en=v; p[cnt].len=w;
p[cnt].ne=he[u]; he[u]=cnt;
}