【发布时间】:2021-08-29 02:00:21
【问题描述】:
我从 ICPC 的 CP3 书中找到了这个算法,它是 Dijkstra 的一个变体,但在某些情况下它会提供 TLE(隐藏测试)。虽然看起来这个算法的运行时间与 Dijkstra 相同,但我认为它是不同的。谁能帮我解决这个算法的时间复杂度。
vector<int> visited(N,0),dis(N,0);
vector<pair<int,int> > adj[N]; // value, node
void dijkstra()
{
for(int i=2;i<=N;i++)
dis[i]=N;
priority_queue<pair<int,int> ,vector<pair<int,int> >,greater<pair<int,int> > > pq;
pq.push(make_pair(0,1));
while(!pq.empty())
{
pair<int,int> p=pq.top();
ll x=p.second;
pq.pop();
if(p.first>dis[x])
continue;
for(int i=0;i<adj[x].size();i++)
{
if(dis[adj[x][i].ss]>dis[x]+adj[x][i].first)
{
dis[adj[x][i].second]=dis[x]+adj[x][i].first;
pq.push(make_pair(dis[adj[x][i].second],adj[x][i].second));
}
}
}
}
【问题讨论】:
-
.ff 是pair的第一个值,.ss 是访问第二个值。
-
这对存储
<weight, connecting node>用于特定边缘 -
很抱歉,这是错误的。我改正了
-
其实是我自己写的,但没有贴出整个代码,因为很难阅读
-
然后停止为每个人都知道的事物#defining 新的、非描述性的名称。无论如何...您正在使用 dis[N],但它的索引最多只有 N-1。估计也去过。这些是缓冲区溢出。此外,
dis[i]=N不一定是足够高的值。在 C++ 中,您应该从 0 开始计数
标签: c++ algorithm time-complexity dijkstra