这个暑假啥也没干,看了点图论,水一条图论的一些优化方案。
有向无环图有一个很好的特性,有向无环图存在拓扑序 , 不同版本的求最小路模型是在拓扑序的流程下进行的(spfa除外)比如dijkstra算法, 由此我们可以先对有向无环图进行一个拓扑排序,然后按照拓扑序去求最短路(更新最短路)。
模板代码:
void topsort()
{
int q[N] , hh = 0 , tt = 0 ;
for(int i = 0 ; i < n ; i ++ )
if(!d[i]) q[tt ++] = i ;
while(hh != tt)
{
int t = q[hh ++] ;
for(int i = h[t] ; ~i ; i = ne[i])
{
int j = e[i] ;
if(-- d[j] == 0)
q[tt ++] = j ;
}
}
}
void top_dijkstra()
{
memset(dist , 0x3f , sizeof dsit) ;
for(int i = 0 ; i < n ; i ++ )
if(!d[i]) dist[i] = 0 ;
for(int i = 0 ; i < n ; i ++)
{
for(int j = h[i] ; ~j ; j = ne[j])
{
int w = e[j] ;
dist[w] = min(dist[w] , dist[i] + w[j]) ;
}
}
}
只能在有向无环图使用,时间复杂度是o(n + m)