最短路径模板
想看详解的请移步
想用链式前项星看
dijkstra
#include<bits/stdc++.h>
using namespace std;
int n,m,s,d[10010],b[10010];
struct node
{
int y,z;
};
vector<node> v[10010];
void dijkstra(int s)
{
for(int i=1;i<=n;i++)d[i]=(1ll<<31)-1;
priority_queue<int,vector<pair<int,int> >,greater<pair<int,int> > >q;
d[s]=0;
q.push(make_pair(0,s));
while(!q.empty())
{
int x=q.top().second;
q.pop();
if(b[x])continue;
b[x]=1;
for(int i=0;i<v[x].size();i++)
{
node y=v[x][i];
if(d[y.y]>d[x]+y.z)
{
d[y.y]=d[x]+y.z;
q.push(make_pair(d[y.y],y.y));
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1,x,y,z;i<=m;i++)
{
cin>>x>>y>>z;
v[x].push_back(node{y,z});
}
dijkstra(s);
for(int i=1;i<=n;i++)
{
if(d[i]==(1ll<<31)-1)cout<<(1ll<<31)-1<<" ";
else cout<<d[i]<<" ";
}
return 0;
}
SPFA
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
long long d[10010];
struct node
{
int y,s;
};
vector<node> v[10010];
queue<int> q;
bool b[10010];
void SPFA(int s)
{
for(int i=1;i<=n;i++)d[i]=(1ll<<31)-1;
d[s]=0;
q.push(s);
b[s]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=0;i<v[x].size();i++)
{
node y=v[x][i];
if(d[y.y]>d[x]+y.s)
{
d[y.y]=d[x]+y.s;
if(!b[y.y])
{
b[y.y]=1;
q.push(y.y);
}
}
}
b[x]=0;
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1,x,y,l;i<=m;i++)
{
cin>>x>>y>>l;
v[x].push_back(node{y,l});
}
SPFA(s);
for(int i=1;i<=n;i++)cout<<d[i]<<" ";
return 0;
}
floyd
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
long long f[1010][1010];
void floyd()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
f[j][k]=min(f[j][i]+f[i][k],f[j][k]);
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j)f[i][j]=(1ll<<31)-1;
}
}
for(int i=1,x,y,l;i<=m;i++)
{
cin>>x>>y>>l;
f[x][y]=min(f[x][y],1ll*l);
}
floyd();
for(int i=1;i<=n;i++)cout<<f[s][i]<<" ";
return 0;
}