你可以将队列转换为优先队列来进行优化。
请查看下面的代码。
#include<bits/stdc++.h>
#define mod 1000000000000
using namespace std;
typedef long long int ll;
typedef long double ld;
vector<ll> pred1,pred2;
vector<ll> dist1,dist2;
vector<ll> vis1,vis2;
vector< pair<ll,ll> > v[100005];
class compare{
public:
bool operator()(pair<ll,ll> x,pair<ll,ll> y)
{
return x.second>y.second;
}
};
bool cmp(ll x,ll y)
{
return x>y;
}
int main()
{
ll n,k,x,y,d;
cin>>n>>k;
pred1.clear();
dist1.clear();
vis1.clear();
dist1.resize(n+5);
vis1.resize(n+5);
pred1.resize(n+5);
for(ll i=0;i<=n;i++)
{
dist1[i]=mod;
pred1[i]=0;
v[i].clear();
}
for(ll i=0;i<k;i++)
{
cin>>x>>y>>d;
v[x].push_back(make_pair(y,d));
v[y].push_back(make_pair(x,d));
}
ll a,b;
a=1;
b=n;
dist1[a]=0;
priority_queue< pair<ll,ll> , vector< pair<ll,ll> > , compare > q;
pair<ll,ll> p={a,0};
q.push(p);
while(q.size()!=0)
{
p=q.top();
q.pop();
if(vis1[p.first]==true)
continue;
vis1[p.first]=true;
ll idx=p.first;
for(ll i=0;i<v[idx].size();i++)
{
if(dist1[v[idx][i].first]>dist1[idx]+( (v[idx][i].second-dist1[idx]>=0) ? (v[idx][i].second-dist1[idx]) : 0 ) )
{
dist1[v[idx][i].first]=dist1[idx]+( (v[idx][i].second-dist1[idx]>=0) ? (v[idx][i].second-dist1[idx]) : 0 );
q.push(make_pair(v[idx][i].first,dist1[v[idx][i].first]));
pred1[v[idx][i].first]=idx;
}
}
}
if(dist1[b]==mod)
{
cout<<"NO PATH EXISTS\n";
return 0;
}
cout<<dist1[b]<<"\n";
return 0;
}
O(E log V)
,使用“标准”实现(带有优先队列)。您还可以查看https://en.wikipedia.org/wiki/Shortest_Path_Faster_Algorithm。 - kfx