用优先队列(堆)优化的Dijkstra算法:
#include<bits/stdc++.h>
#define maxn 100005
#define inf 0x3f3f3f3f
using namespace std;
vector<pair<int,int> > e[maxn];
int dis[maxn];
int vis[maxn];
int main(){
int n,m,x,y,z;
while(cin>>n>>m){
memset(dis,inf,sizeof(dis));
memset(vis,0,sizeof(vis));
for(int i=0;i<=n;i++) e[i].clear();
for(int i=0;i<m;i++){
scanf("%d%d%d",&x,&y,&z);
e[x].push_back(make_pair(y,z));
e[y].push_back(make_pair(x,z));
}
int s,t;
scanf("%d%d",&s,&t);
priority_queue<pair<int,int> > q;
dis[s]=0;
q.push(make_pair(0,s));
while(!q.empty()){
int cur=q.top().second;
q.pop();
if(vis[cur]) continue;
vis[cur]=1;
for(int i=0;i<e[cur].size();i++){
int v=e[cur][i].first;
if(!vis[v]&&dis[v]>dis[cur]+e[cur][i].second){
dis[v]=dis[cur]+e[cur][i].second;
q.push(make_pair(-dis[v],v));
}
}
}
if(dis[t]!=inf) printf("%d\n",dis[t]);
else printf("-1\n");
}
return 0;
}
spfa+向前星模板:
#include<bits/stdc++.h>
#define maxn 100005
#define inf 0x3f3f3f3f
using namespace std;
int head[maxn],vis[maxn],dis[maxn],top;
struct edge{
int to,next,val;
}e[maxn];
void add(int x,int y,int z){
e[top].to=y;
e[top].val=z;
e[top].next=head[x];
head[x]=top++;
}
int main(){
int n,m,x,y,z;
while(~scanf("%d%d",&n,&m)){
memset(dis,inf,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
top=1;
while(m--){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
int s,t;
scanf("&d&d",&s,&t);
queue<int> que;
dis[s]=0;
que.push(s);
while(!que.empty()){
int u=que.front(); que.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=e[i].next){
int v=e[i].to;
if(dis[v]>dis[u]+e[i].val){
dis[v]=dis[u]+e[i].val;
if(!vis[v]){
vis[v]=1;
que.push(v);
}
}
}
}
if(dis[t]!=inf) printf("%d\n",dis[t]);
else printf("-1\n");
}
}