dfs bfs 最短路 最小生成树 出错原因
更新出錯
g[nx][ny]寫成g[nx][nx]
import ("container/heap""math"
)
func minimumEffortPath(heights [][]int) int {n,m:=len(heights),len(heights[0])direction:=[][]int{{-1,0},{1,0},{0,1},{0,-1}}g:=make([][]int,n)for i:=0;i<n;i++{g[i]=make([]int, m)for j:=0;j<m;j++{g[i][j]=math.MaxInt64}}g[0][0]=0h:=&hp{{0,0,0}}for h.Len()>0{p:=heap.Pop(h).(pair)x,y,d:=p.x,p.y,p.dif x==n-1&&y==m-1{return d}for i:=range direction{nx,ny:=x+direction[i][0],y+direction[i][1]if nx>=0&&nx<n&&ny>=0&&ny<m{diff:=max(d,abs(heights[x][y]-heights[nx][ny]))if g[nx][ny]>diff{g[nx][ny]=diffheap.Push(h,pair{nx,ny,diff})}}}}return -1
}
func abs(x int)int{if x<0{return -x}else{return x}
}
type pair struct{x,y,d int}
type hp []pair
func(h hp)Len()int{return len(h)}
func(h hp)Less(i,j int)bool{return h[i].d<h[j].d}
func(h hp)Swap(i,j int){h[i],h[j]=h[j],h[i]}
func(h *hp)Push(x interface{}){*h=append(*h,x.(pair))}
func(h *hp)Pop()interface{}{old:=*hn:=len(old)x:=old[n-1]*h=old[:n-1]return x
}
初始化錯誤
g和dis忘記初始化第一布節點為0
並察冀出錯
find中用for代替if
import ("sort"
)
type untionFind struct{rank []intparent []int
}
func newUnionFind(n int)untionFind{rank:=make([]int,n)parent:=make([]int,n)for i:=0;i<n;i++{rank[i]=1parent[i]=i}return untionFind{rank,parent}
}
func(uf *untionFind)find(x int)int{if uf.parent[x]!=x{uf.parent[x]=uf.find(uf.parent[x])}return uf.parent[x]
}
func(uf *untionFind)union(i,j int)bool{fx,fy:=uf.find(i),uf.find(j)if fx==fy{return false}if uf.rank[fx]<uf.rank[fy]{fx,fy=fy,fx}uf.rank[fx]+=uf.rank[fy]uf.parent[fy]=fxreturn true
}
func dist(p,q []int)int{return abs(p[0]-q[0])+abs(p[1]-q[1])
}
func abs(x int)int{if x<0{return -x}else{return x}
}
func minimumCost(n int, connections [][]int) int {sort.Slice(connections,func(i,j int)bool{return connections[i][2]<connections[j][2]})left:=n-1u:=newUnionFind(n)ans:=0for _,e:=range connections{if u.union(e[0]-1,e[1]-1){ans+=e[2]left--if left==0{break}}}if left==0{return ans}else{return -1}
}