RT,今天做图论题,用了Dij,不知道下面两种写法在复杂度上有什么区别,望指教
void dij(int x)
{
q.push(make_pair(0,make_pair(k + point[x],x)));
memset(f,0x3f,sizeof(f));
f[k + point[x]][x] = 0;
while(!q.empty())
{
int val,pos,kx;
val = q.top().first,pos = q.top().second.second,kx = q.top().second.first;
q.pop();
if(f[kx][pos] != val) continue;
for(int i = ehead[pos];i;i = e[i].nxt)
{
int v = e[i].to;
if(kx + point[v] > k * 2|| kx + point[v] < 0) continue;
if(e[i].val + val < f[kx + point[v]][v])
{
f[kx + point[v]][v] = e[i].val + val;
q.push(make_pair(e[i].val + val,make_pair(kx + point[v],v)));
}
}
}
}
void dij(int x)
{
q.push(make_pair(0,make_pair(k + point[x],x)));
memset(f,0x3f,sizeof(f));memset(vis,0,sizeof(vis));
f[k + point[x]][x] = 0;
while(!q.empty())
{
int val,pos,kx;
val = q.top().first,pos = q.top().second.second,kx = q.top().second.first;
q.pop();
if(vis[kx][pos]) continue;
vis[kx][pos] = true;
for(int i = ehead[pos];i;i = e[i].nxt)
{
int v = e[i].to;
if(kx + point[v] > k * 2|| kx + point[v] < 0) continue;
if(e[i].val + val < f[kx + point[v]][v])
{
f[kx + point[v]][v] = e[i].val + val;
q.push(make_pair(e[i].val + val,make_pair(kx + point[v],v)));
}
}
}
}