SPFA(邻接表+队列)
#include<bits/stdc++.h>
using namespace std;
const int INF=2e9;
const int N=2510;
struct edge
{
int from,to,w;
edge (int a,int b,int c){ from=a;to=b;w=c;}
};
vector<edge>e[N];
int n,m,s,t;
int dis[N];
bool inq[N];
int pre[N];
void spfa(int s)
{
for(int i=1;i<=n;i++) { dis[i]=INF;inq[i]=false;}
dis[s]=0;
queue<int>q;
q.push(s);
inq[s]=true;
while(!q.empty())
{
int u=q.front();
q.pop();
inq[u] = false;
int len=e[u].size();
for(int i=0;i<len;i++)
{
int v=e[u][i].to,w=e[u][i].w;
if(dis[u]+w<dis[v])
{
dis[v]=dis[u]+w;
pre[v]=u;
if(!inq[v])
{
inq[v] = true;
q.push(v);
}
}
}
}
}
int main()
{
while(~scanf("%d%d%d%d",&n,&m,&s,&t))
{
for(int i=1;i<=n;i++) e[i].clear();
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
e[a].push_back(edge(a,b,c));
e[b].push_back(edge(b,a,c));
}
spfa(s);
printf("%d\n",dis[t]);
}
return 0;
}
Dijkstra(邻接矩阵)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF=2e9;
int e[2510][2510];
bool vis[2510];
int dis[2510];
int t,s,n,m;
void dijkstra()
{
memset(vis,0,sizeof vis);
memset(dis,0x3f,sizeof dis);
dis[s]=0;
for(int i=1;i<n;i++)
{
int u=0;
for(int j=1;j<=n;j++)
if(!vis[j]&&(u==0||dis[u]>dis[j]))
u=j;
vis[u]=true;
for(int j=1;j<=n;j++)
dis[j]=min(dis[j],dis[u]+e[u][j]);
}
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m>>s>>t;
memset(e,0x3f,sizeof e);
for(int i=1;i<=n;i++) e[i][i]=0;
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
if(c<e[a][b]) e[a][b]=e[b][a]=c;
}
dijkstra();
cout<<dis[t]<<endl;
return 0;
}