```go
package main
import "fmt"
func main() {
var w, b int
fmt.Scan(&w, &b)
dp := make([][]float64, w+1)
for i := range dp {
dp[i] = make([]float64, b+1)
}
for i := 1; i <= w; i++ {
dp[i][0] = 1.0
}
for i := 1; i <= w; i++ {
for j := 1; j <= b; j++ {
// Probability Princess picks White immediately
pWinDirect := float64(i) / float64(i+j)
// Probability Princess continues the game:
// 1. Princess picks Black: j / (i+j)
// 2. Dragon picks Black: (j-1) / (i+j-1)
// If Dragon picks White, Princess loses immediately (prob 0 for winning).
// If Dragon picks Black, a random mouse jumps out.
pContinue := 0.0
if j >= 2 {
// Denominator for the jump event
denomJump := float64(i + j - 2)
// Case A: White mouse jumps out
pJumpWhite := float64(i) / denomJump
valJumpWhite := dp[i-1][j-2]
// Case B: Black mouse jumps out
pJumpBlack := float64(j-2) / denomJump
valJumpBlack := 0.0
if j >= 3 {
valJumpBlack = dp[i][j-3]
}
pNext := pJumpWhite*valJumpWhite + pJumpBlack*valJumpBlack
// Combined probability for this branch
pPrincessBlack := float64(j) / float64(i+j)
pDragonBlack := float64(j-1) / float64(i+j-1)
pContinue = pPrincessBlack * pDragonBlack * pNext
}
dp[i][j] = pWinDirect + pContinue
}
}
fmt.Printf("%.10f\n", dp[w][b])
}
```