zoukankan      html  css  js  c++  java
  • 服务依赖开闭简单算法

    // 服务依赖

    // n q, n个服务,q次查询。
    // 下面n行,表示第i个服务依赖的服务数量k,下面k服务id分别x,xx。k=0表示没有依赖
    // 下面q行,表示q次查询,每次查询x,y,x=1表示开启y服务,x=0表示关闭y服务
    // 重复 开启、关闭同一个服务不会造成任何影响
    // 当服务 a 引入了服务 b 作为依赖之后,服务 a 启动时 b 会随之启动,b 停止时 a 会随之停止

    package main
    
    import (
    	"fmt"
    )
    
    
    // 3 2
    // 1 2
    // 1 3
    // 0
    // 1 1
    // 0 2
    type service struct {
    	isOpen   bool
    	requires []int
    }
    
    var serviceMap = make(map[int]*service)
    var serviceStatus = make(map[int]bool)
    var opened = 0
    
    func main() {
    	n, q := 0, 0
    	fmt.Scan(&n, &q)
    	for i := 1; i <= n; i++ {
    		e := &service{isOpen: false}
    		serviceMap[i] = e
    		serviceStatus[i] = false
    
    		subs := 0
    		fmt.Scan(&subs)
    		if subs == 0 {
    			continue
    		}
    
    		for j := 0; j < subs; j++ {
    			v := 0
    			fmt.Scan(&v)
    			e.requires = append(e.requires, v)
    		}
    	}
    
    	x, y := 0, 0
    	for i := 0; i < q; i++ {
    		fmt.Scan(&x, &y)
    		if x == 1 {
    			open(y)
    		} else {
    			closes(y)
    		}
    		fmt.Println(opened)
    	}
    }
    
    // open by bfs
    func open(id int) {
    	if isOpened := serviceStatus[id]; isOpened {
    		return
    	}
    
    	q := []int{id}
    	for len(q) > 0 {
    		front := q[0]
    		q = q[1:]
    
    		e := serviceMap[front]
    		if e.isOpen {
    			continue
    		}
    
    		opened++
    		e.isOpen = true
    		serviceStatus[front] = true
    		q = append(q, e.requires...)
    	}
    }
    
    // closes by dfs Recursion
    func closes(id int) {
    	if isOpened := serviceStatus[id]; !isOpened {
    		return
    	}
    
    	opened--
    	serviceStatus[id] = false
    	serviceMap[id].isOpen = false
    	for k, v := range serviceMap {
    		if k != id && v.isOpen && InArray(id, v.requires) {
    			closes(k)
    		}
    	}
    }
    
    func InArray(x int, arr []int) bool {
    	for _, v := range arr {
    		if v == x {
    			return true
    		}
    	}
    	return false
    }
    
    
    © 2017-2020 版权属于 QXQZX &
  • 相关阅读:
    解决Linux中java.net.UnknownHostException: oracledb.sys.iflashbuy.com问题
    Jenkins学习九:Jenkins插件之构建MSBuild
    Fitnesse初体验
    Jenkins遇到问题三:调整jdk版本不生效的解决办法
    linux强制用户下线
    Jenkins学习八:Jenkins语言本地化
    一个完整的JENKINS下的ANT BUILD.XML文件
    -bash: rz: command not found
    Jenkins学习七:Jenkins的授权和访问控制
    Android ormlite like() function is not working
  • 原文地址:https://www.cnblogs.com/devhg/p/15256733.html
Copyright © 2011-2022 走看看