Non-crossing lines to connect points in a circle
Consider a circle with n points on circumference of it where n is even. Count number of ways we can connect these points such that no two connecting lines to cross each other and every point is connected with exactly one other point. Any point can be connected with any other point.
Consider a circle with 4 points.
1
2 3
4
In above diagram, there are two
non-crossing ways to connect
{{1, 2}, {3, 4}} and {{1, 3}, {2, 4}}.
Note that {{2, 3}, {1, 4}} is invalid
as it would cause a cross
Examples :
Input : n = 2
Output : 1
Input : n = 4
Output : 2
Input : n = 6
Output : 5
Input : n = 3
Output : Invalid
n must be even.
We need to draw n/2 lines to connect n points. When we draw a line, we divide the points in two sets that need to connected. Each set needs to be connected within itself. Below is recurrence relation for the same.
Let m = n/2
// For each line we draw, we divide points
// into two sets such that one set is going
// to be connected with i lines and other
// with m-i-1 lines.
Count(m) = ? Count(i) * Count(m-i-1)
where 0 <= i < m
Count(0) = 1
Total number of ways with n points
= Count(m) = Count(n/2)
If we take a closer look at above recurrence, it is actually recurrence of Catalan Numbers. So the task reduces to finding n/2’th Catalan number.
Below is implementation based on above idea.
C++
#include <iostream>
using namespace std;
unsigned long int catalanDP(unsigned int n)
{
unsigned long int catalan[n + 1];
catalan[0] = catalan[1] = 1;
for ( int i = 2; i <= n; i++) {
catalan[i] = 0;
for ( int j = 0; j < i; j++)
catalan[i] += catalan[j] * catalan[i - j - 1];
}
return catalan[n];
}
unsigned long int countWays(unsigned long int n)
{
if (n & 1) {
cout << "Invalid" ;
return 0;
}
return catalanDP(n / 2);
}
int main()
{
cout << countWays(6) << " " ;
return 0;
}
|
C
#include <stdio.h>
unsigned long int catalanDP(unsigned int n)
{
unsigned long int catalan[n + 1];
catalan[0] = catalan[1] = 1;
for ( int i = 2; i <= n; i++) {
catalan[i] = 0;
for ( int j = 0; j < i; j++)
catalan[i] += catalan[j] * catalan[i - j - 1];
}
return catalan[n];
}
unsigned long int countWays(unsigned long int n)
{
if (n & 1) {
printf ( "Invalid" );
return 0;
}
return catalanDP(n / 2);
}
int main()
{
printf ( "%ld" , countWays(6));
return 0;
}
|
Java
import java.io.*;
class GFG {
static int catalanDP( int n)
{
int [] catalan = new int [n + 1 ];
catalan[ 0 ] = catalan[ 1 ] = 1 ;
for ( int i = 2 ; i <= n; i++) {
catalan[i] = 0 ;
for ( int j = 0 ; j < i; j++)
catalan[i]
+= catalan[j] * catalan[i - j - 1 ];
}
return catalan[n];
}
static int countWays( int n)
{
if (n < 1 ) {
System.out.println( "Invalid" );
return 0 ;
}
return catalanDP(n / 2 );
}
public static void main(String[] args)
{
System.out.println(countWays( 6 ) + " " );
}
}
|
Python3
def catalanDP(n):
catalan = [ 1 for i in range (n + 1 )]
for i in range ( 2 , n + 1 ):
catalan[i] = 0
for j in range (i):
catalan[i] + = (catalan[j] *
catalan[i - j - 1 ])
return catalan[n]
def countWays(n):
if (n & 1 ):
print ( "Invalid" )
return 0
return catalanDP(n / / 2 )
print (countWays( 6 ))
|
C#
using System;
class GFG
{
static int catalanDP( int n)
{
int []catalan = new int [n + 1];
catalan[0] = catalan[1] = 1;
for ( int i = 2; i <= n; i++)
{
catalan[i] = 0;
for ( int j = 0; j < i; j++)
catalan[i] += catalan[j] *
catalan[i - j - 1];
}
return catalan[n];
}
static int countWays( int n)
{
if (n < 1)
{
Console.WriteLine( "Invalid" );
return 0;
}
return catalanDP(n / 2);
}
static public void Main ()
{
Console.WriteLine(countWays(6) + " " );
}
}
|
PHP
<?php
function catalanDP( $n )
{
$catalan [0] = $catalan [1] = 1;
for ( $i = 2; $i <= $n ; $i ++)
{
$catalan [ $i ] = 0;
for ( $j = 0; $j < $i ; $j ++)
$catalan [ $i ] += $catalan [ $j ] *
$catalan [ $i - $j - 1];
}
return $catalan [ $n ];
}
function countWays( $n )
{
if ( $n & 1)
{
echo "Invalid" ;
return 0;
}
return catalanDP( $n / 2);
}
echo countWays(6) , " " ;
?>
|
Javascript
<script>
function catalanDP(n)
{
let catalan = []
catalan[0] = catalan[1] = 1;
for (let i = 2; i <= n; i++)
{
catalan[i] = 0;
for (let j = 0; j < i; j++)
catalan[i] += catalan[j] *
catalan[i - j - 1];
}
return catalan[n];
}
function countWays(n)
{
if (n & 1)
{
document.write( "Invalid" );
return 0;
}
return catalanDP(n / 2);
}
document.write(countWays(6) + " " );
</script>
|
Output :
5
Time Complexity : O(n2)
Auxiliary Space : O(n)
Last Updated :
02 May, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...