

package main
import "fmt"
type graph struct {
list [][]int
}
func newGraph(m int) *graph {
return &graph{
list: make([][]int, m),
}
}
func (g *graph) addEdge(v1, v2 int) {
g.list[v1] = append(g.list[v1], v2)
g.list[v2] = append(g.list[v2], v1)
}
func (g *graph) isDraw(node, color int, drawMap []int) bool {
for _, neiborNode := range g.list[node] {
if drawMap[neiborNode] == 0 && color == 0 {
return false
}
}
return true
}
func countDraw(g *graph, drawMap []int, node int, count *int) {
if node == len(g.list) {
*count++
return
} else {
//红色:0 黑色:1
for i := 0; i <= 1; i++ {
if g.isDraw(node, i, drawMap) {
drawMap[node] = i
countDraw(g, drawMap, node+1, count)
drawMap[node] = -1
}
}
}
}
func main() {
var m, n int
fmt.Scan(&m, &n)
myGraph := newGraph(m)
for i := 0; i < n; i++ {
var temp1, temp2 int
fmt.Scan(&temp1, &temp2)
myGraph.addEdge(temp1-1, temp2-1)
}
drawMap := make([]int, m)
for i := 0; i < m; i++ {
drawMap[i] = -1
}
var count int
countDraw(myGraph, drawMap, 0, &count)
fmt.Println(count)
}