从零开始学golang之Bellman

freedbg · · 975 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

```go package main import ( "fmt" ) type Edge struct { u, v, weight int } var edge [10]Edge var dist [10]int var maxValue int var source int var nodeNum int var edgeNum int func init() { maxValue = 100 } func initEdge() { fmt.Println("input nodeNum edgeNum source") fmt.Scanf("%d %d %d", &nodeNum, &edgeNum, &source) fmt.Println(nodeNum, edgeNum, source) for i := 0; i <= nodeNum; i++ { dist[i] = maxValue } dist[source] = 0 for i := 0; i < edgeNum; i++ { fmt.Println("input edge.strat edge.end edge.weight") fmt.Scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].weight) if edge[i].u == source { dist[edge[i].v] = edge[i].weight } } fmt.Println(edge) fmt.Println(dist) } func Bellman() { //nodeNum -1 自身节点需要去除 for i := 0; i < nodeNum-1; i++ { //查找已知权重节点 相连接节点 并且更新权重 for j := 0; j < edgeNum; j++ { if dist[edge[j].v] > dist[edge[j].u]+edge[j].weight { dist[edge[j].v] = dist[edge[j].u] + edge[j].weight } } } fmt.Println(dist) //不存在负环路时,都有 v.d < = u.d + w ( u , v ) for i := 0; i < edgeNum; i++ { if dist[edge[i].v] > dist[edge[i].u]+edge[i].weight { //存在负环路时,一定存在某条边使得 v.d >u.d + w ( u , v ) fmt.Println("Find 负环路") return } } //另一种方案 从start出发。不断维护每个点的最短距离,如果有负权环,则会进行无数次的维护,越来越小,所以如果循环次数大于了V - 1则有负权环。 } func main() { //Bellman 差分约束系统 线性规划 fmt.Println("Bellman") initEdge() Bellman() } ``` 所有代码地址 https://github.com/godla/golang-sort-data-structures-study.git 一起每天写一点

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

975 次点击  
加入收藏 微博
1 回复  |  直到 2018-02-06 10:52:52
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传