如题。假设一张图的点数为 n,边数为 m。
大家都说优先队列Dijkstra的时间复杂度是:
O( (m+n) log n)。
但是,看我下面的代码
#include <bits/stdc++.h>
using namespace std;
int n,m,s,u,v,w,dis[100001];
struct node
{
int u,v;
bool operator< (const node &a)const
{
return v>a.v;
}
};
#define pi pair<int,int>
vector<pi>vec[100001];
bool vis[100001];
priority_queue<node>q;
void dij()
{
q.push({s,0});
while(!q.empty())
{
node nu=q.top();//当前点
q.pop();
int p=nu.u;//编号
vis[p]=1;
int v=nu.v;//目前的“最短”距离
if(v>dis[p])continue;
for(pi pu:vec[p])//枚举后面几个点
{
int uu=pu.first;
int vv=pu.second+v;
if(uu==p||vis[uu])continue;
if(vv<dis[uu])
{
dis[uu]=vv;
q.push({uu,vv});
}
printf("%d\n",q.size());
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);//n点m边s初始
while(m--)
{
scanf("%d%d%d",&u,&v,&w);//u到v权值为w
vec[u].push_back({v,w});//插入
}
for(int i=1;i<=n;++i)dis[i]=2000000000;
dis[s]=0;
dij();
for(int i=1;i<=n;++i)printf("%d ",dis[i]==2000000000?-1:dis[i]);
return 0;
}
理论上来讲,一个优先队列里面最多有 m 个元素,但你只需要取出 n 个元素。所以时间复杂度不应该是O(n log m)吗?