洛谷上这个题的题解还是比较好的,可以借鉴下。
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=6201;
const int maxv=2501;
const int inf=(1<<31)-1;
vector<int> V[maxn],w[maxn];
int dis[maxv];
int n,m,s,t;
bool visit[maxv]={false};
//没有用堆优化,所以可能会超时O(n^2)
/*
所以问题又来了,如果用堆优化的话,那两种方法怎么写来着???
*/
struct Node
{
int v,cost;
};
bool operator < (Node a,Node b)
{
return a.cost>b.cost;
}
void Dijkstra()
{
priority_queue<Node> q;
for(int i=1;i<=n;i++) dis[i]=inf;
dis[s]=0;
// for(int i=0;i<V[s].size();i++)
// {
// int tmp=V[s][i];
// dis[tmp]=w[s][i];//dis数组初始化
// }
Node tn;
tn.v=s; tn.cost=0;
q.push(tn);
while(!q.empty())
{
//cout<<"*\n";
Node t=q.top();
q.pop();
int u=t.v;
if(visit[u]) continue;
visit[u]=true;
for(int i=0;i<V[u].size();i++)
{
//cout<<"^\n";
if(dis[V[u][i]]>dis[u]+V[u][i])
{
dis[V[u][i]]=dis[u]+w[u][i];
tn.v=V[u][i];
tn.cost=dis[V[u][i]];
q.push(tn);
//cout<<"$$\n";
}
}
}
}
void Print()
{
for(int i=1;i<=n;i++) cout<<dis[i]<<" ";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>s>>t;
int a,b,c;
for(int i=1;i<=m;i++)
{
cin>>a>>b>>c;
V[a].push_back(b);
V[b].push_back(a);
w[a].push_back(c);
w[b].push_back(c);
}
Dijkstra();
cout<<dis[t];
// Print();
return 0;
}
用堆来优化的话,dis数组在初始化时,不能将与源点相邻的点的距离直接改好,都置为inf就好了。要不然,在后面循环的时候与源点直接相邻的点不会进队,也就没法求最短路了。