首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
G=(V,E)是赋权有向图,其中一个顶点为s。每条边的权值均
[问答题]
G=(V,E)是赋权有向图,其中一个顶点为s。每条边的权值均为取自{0,1,…,K}的数。试设计算法,计算由s到其他顶点的最短路径,使算法时间复杂性达到O((V+E)logK)。
添加笔记
求解答(0)
邀请回答
收藏(1)
分享
纠错
1个回答
添加回答
2
维克多·宇哥
//迪杰特斯拉的堆优化算法。
//将最原本的迪杰特斯拉算法的第二重循环使用堆,就能达到要求
void down(int x)
{
x<<=1;
if (x>t) return;
if (x<t&&d[s[x+1]]<d[s[x]]) x++;
if (d[s[x]]>=d[s[x>>1]]) return;
swap(s[x],s[x>>1]);
swap(p[s[x]],p[s[x>>1]]);
down(x);
}
void up(int x)
{
if (x==1||d[s[x>>1]]<=d[s[x]]) return;
swap(s[x],s[x>>1]);
swap(p[s[x]],p[s[x>>1]]);
up(x>>1);
}
void dijkstra()
{
int i,x,k;
t=s[1]=1;
for (i=2;i<=n;i++) d[i]=oo;
while (t)
{
x=s[1];
s[1]=s[t--];
p[s[1]]=1;
p[x]=-1;
down(1);
for (i=first[x];i;i=next[i])
{
k=v[i];
if (p[k]==-1) continue;
if (!p[k])
{
s[++t]=k;
p[k]=t;
}
if (d[k]>d[x]+w[i])
{
d[k]=d[x]+w[i];
up(p[k]);
}
}
}
}
发表于 2017-12-18 22:24:34
回复(2)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
图
上传者:
赞花婆
难度:
1条回答
1收藏
3441浏览
热门推荐
相关试题
假定一个待哈希存储的线性表为(32...
哈希
评论
(1)
5.下列判断正确的是( )
资料分析
言语理解与表达
资料分析
评论
(1)
《拳皇97》最后BOSS是谁?
游戏常识
评论
(1)
《魔兽世界》中,下列不属于玩家可以...
游戏常识
评论
(1)
你有没有崇拜的偶像,你欣赏他/她身...
通用能力
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题