Monday, 10 August 2015

Find Transitive relations in a graph represented via adjacency matrix using Java....

Problem:-Using the Java language, have the function TransitivityRelations(strArr) read the strArr parameter being passed which will make up an NxN matrix where the rows are separated by each pair of parentheses (the matrix will range from 2x2 to 5x5). The matrix represents connections between nodes in a graph where each node corresponds to the Nth element in the matrix (with 0 being the first node). If a connection exists from one node to another, it will be represented by a 1, if not it will be represented by a 0. For example: suppose strArr were a 3x3 matrix with input 

["(1,1,1)","(1,0,0)","(0,1,0)"], this means that there is a connection from node 0->0, 0->1, and 0->2. For node 1 the connections are 1->0, and for node 2 the connections are 2->1. This can be interpreted as a connection existing from node X to node Y if there is a 1 in the Xth row and Yth column. Note: a connection from X->Y does not imply a connection from Y->X. 

What your program should determine is whether or not the matrix, which represents connections among the nodes, is transitive. A transitive relationmeans that if the connections 0->1 and 1->2 exist for example, then there must exist the connection 0->2. More generally, if there is a relation xRy and yRz, then xRz should exist within the matrix. If a matrix is completely transitive, return the string transitive. If it isn't, your program should return the connections needed, in the following format, in order for the matrix to be transitive: (N1,N2)-(N3,N4)-(...). So for the example above, your program should return (1,2)-(2,0). You can ignore the reflexive property of nodes in your answers. Return the connections needed in lexicographical order [e.g. (0,1)-(0,4)-(1,4)-(2,3)-(4,1)]. 


Note:-This program is only for 3x3 matrix ,but you can extend to a program generic for any size matrix .

here is the code for it .....




       

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Transitive {

 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub

  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  String matrix = br.readLine();
  //String mat="[\"(1,1,1)\",\"(1,1,1)\",\"(1,1,0)\"]";
  System.out.println("the desired result is " + TransitiveRelations(matrix));

 }

 public static ArrayList < String > TransitiveRelations(String strArr) {

  int[][] mat = new int[3][3];

  ArrayList < String > aka = new ArrayList < String > ();
  String[] arr = strArr.split("\\)");

  String[] a1 = arr[0].split("\\(");
  String[] a2 = arr[1].split("\\(");
  String[] a3 = arr[2].split("\\(");

  String[] r1 = a1[1].split(",");
  String[] r2 = a2[1].split(",");
  String[] r3 = a3[1].split(",");

  for (int k = 0; k < 3; k++)
   mat[0][k] = Integer.parseInt(r1[k]);


  for (int s = 0; s < 3; s++)
   mat[1][s] = Integer.parseInt(r2[s]);


  for (int p = 0; p < 3; p++)
   mat[2][p] = Integer.parseInt(r3[p]);


  for (int h = 0; h < 3; h++) {
   for (int q = 0; q < 3; q++) {
    for (int e = 0; e < 3; e++) {
     if (h != q) {
      if (mat[h][e] == 1) {
       if (mat[e][q] == 1) {
        if (mat[h][q] == 1)
         continue;
        else aka.add(h + "-" + q);
       } else {
        aka.add(e + "-" + q);
        if (mat[h][q] == 1)
         continue;
        else aka.add(h + "-" + q);
       }
      } else {
       aka.add(h + "-" + e);
       if (mat[e][q] == 1) {
        if (mat[h][q] == 1)
         continue;
        else aka.add(h + "-" + q);
       } else {
        aka.add(e + "-" + q);
        if (mat[h][q] == 1)
         continue;
        else aka.add(h + "-" + q);

       }
      }
     }

    }
   }
  }
  ArrayList < String > a = new ArrayList < String > ();
  for (int t = 0; t < aka.size(); t++)
   if (!a.contains(aka.get(t)) == true)
    a.add(aka.get(t));

  return a;
 }

}
       
 

Find out minimum cost between two nodes in a weighted graph using greedy approach using java.....

Input :- 1.cost matrix for the graph is given via text file ,just write the matrix in the text file simply like we write normally and save it ,change the path of the file in the program too.

2.For those nodes which don't have direct paths between them corresponding entries in the input adjacency matrix via file should be "-1".
here is the code  ........





       
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ShortestPath {
 public static int count = 0;
 public static int[][] matrix;

 public static void main(String[] args) throws NumberFormatException, IOException {
  // TODO Auto-generated method stub
  File file = new File("C:/Users/gauravy/Desktop/matrix.txt");
  BufferedReader be = new BufferedReader(new FileReader(file));
  while ((be.readLine()) != null)
   count++;
  matrix = new int[count][count];
  String fileName = "C:/Users/gauravy/Desktop/matrix.txt";

  FileInputStream inputStream = new FileInputStream(fileName);
  BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream));

  int lineCount = 0;
  String[] numbers;
  String line = null;
  while ((line = bf.readLine()) != null) {
   numbers = line.split(" ");
   for (int i = 0; i < count; i++) {
    matrix[lineCount][i] = Integer.parseInt(numbers[i]);
   }

   lineCount++;
  }
  bf.close();
  for (int l = 0; l < count; l++)
   for (int s = 0; s < count; s++)
    if (matrix[l][s] == -1) matrix[l][s] = Integer.MAX_VALUE;

  System.out.println("Minimum cost which we evaluated is " + minPath(matrix, 3, count - 1));
 }
 public static int minPath(int[][] mat, int i, int j) {
  int cost;
  if (i == j) return 0;
  else {
   int y = getNodeWithMinDistance(i);
   cost = matrix[i][y] + minPath(mat, y, j);
   if (cost < mat[i][j]) return cost;
   else return mat[i][j];
  }
 }

 public static int getNodeWithMinDistance(int source) {
  int min = matrix[source][source + 1];
  int minNeighbourNode = source + 1;
  for (int k = source + 1; k < count; k++) {
   if (matrix[source][k] < min) {
    min = matrix[source][k];
    minNeighbourNode = k;
   }
  }
  return minNeighbourNode;
 }
}

       
 

Friday, 24 July 2015

Java Programming solution to solve a problem on optimal assignments ,detailed problem statement is given below .....

/*Using the Java language, have the function OptimalAssignments(strArr) read strArr which will represent an NxN matrix and it will be in the following format: ["(n,n,n...)","(...)",...] where the n's represent integers. This matrix represents a machine at row i performing task at column j. The cost for this is matrix[i][j]. Your program should determine what machine should perform what task so as to minimize the whole cost and it should return the pairings of machines to tasks in the following format: (i-j)(...)... Only one machine can perform one task. For example: if strArr is ["(5,4,2)","(12,4,3)","(3,4,13)"] then your program should return (1-3)(2-2)(3-1) because assigning the machines to these tasks gives the least cost. The matrix will range from 2x2 to 6x6, there will be no negative costs in the matrix, and there will always be a unique answer*/


import java.util.*; 
import java.io.*;

class Function {  
  String OptimalAssignments(String strArr) { 
  
    // code goes here   
    /* Note: In Java the return type of a function and the 
       parameter types being passed are defined, so this return 
       call must match the return type of the function.
       You are free to modify the return type. */
       int[][] mat=new int[3][3];
       
       
       String[] arr=strArr.split("\\)");
        
        
        
        String[] a1=arr[0].split("\\(");
        String[] a2=arr[1].split("\\(");
        String[] a3=arr[2].split("\\(");
        
          String[] r1=a1[1].split(",");
          String[] r2=a2[1].split(","); 
          String[] r3=a3[1].split(",");  
          
          for(int k=0;k<3;k++)
            mat[0][k]=Integer.parseInt(r1[k]);


          for(int s=0;s<3;s++)
            mat[1][s]=Integer.parseInt(r2[s]);


          for(int p=0;p<3;p++)
            mat[2][p]=Integer.parseInt(r3[p]);
           
         /* for (int y=0;y<3;y++)
           for (int r=0;r<3;r++)
          System.out.println(mat[y][r]);
          */
          Function d=new Function();
         int[] sum=d.mincost_map(mat,0);
          strArr="\"(1-"+sum[0]+")(2-"+sum[1]+")(3-"+sum[2]+")\"";
    return strArr;
    
  } 
  
  
  public int[] mincost_map(int[][] a,int b){
 int[] c=new int[3];
 Function f=new Function();
 //int[][] arr=new int[b][b]; 
        c[0]=f.find_min(a,0,3);
        c[1]=f.find_min(a,1,c[0]);
        c[2]=f.find_min(a,2,c[1]);
 
 return  c;
  }
  
  public int find_min(int[][] a,int r,int num){
 int sum=a[r][0];
 int q=0;
for(int y=0;y<3;y++){
if(a[r][y]<sum)
{ 
if(y==num) 
continue;
else { sum=a[r][y]; q=y;}
}
}
return q;
  }
  
  public static void main (String[] args) throws Exception{  
    // keep this function call here     
    BufferedReader s=new BufferedReader(new InputStreamReader(System.in));
    String str=s.readLine();
    Function c = new Function();
    //String str="[\"(5,4,2)\",\"(12,4,4)\",\"(3,4,13)\"]";
    System.out.print(c.OptimalAssignments(str));
  //Function c=new Function();

   
  
  //System.out.println(c.OptimalAssignments(str));
    
  }   
  
}


Tuesday, 21 July 2015

Java program to find out all possible expressions to insert '+' and '-' in between values 1..to ..9 so that the given sum of the expression remains constant ....like below

/*
Write a program that outputs all possibilities to put + or - or nothing between the numbers 1, 2, ..., 9 (in this order) such that the result is always 100. For example: 1 + 2 + 34 – 5 + 67 – 8 + 9 = 100

*/


       
import java.util.ArrayList;
import java.util.Iterator;

public class TestIt {

 private static int SUM = 200;
 private static int[] values = {
  1,
  2,
  3,
  4,
  5,
  6,
  7,
  8,
  9
 };

 static ArrayList add(int digit, String sign, ArrayList branches) {
  for (int i = 0; i < branches.size(); i++) {
   branches.set(i, digit + sign + branches.get(i));
  }

  return branches;
 }

 static ArrayList f(int sum, int number, int index) {

  int digit = Math.abs(number % 10);
  //System.out.println(digit);
  if (index >= values.length) {
   if (sum == number) {
    ArrayList result = new ArrayList();
    result.add(Integer.toString(digit));
    return result;
   } else {
    return new ArrayList();
   }
  }

  ArrayList branch1 = f(sum - number, values[index], index + 1);
  ArrayList branch2 = f(sum - number, -values[index], index + 1);

  int concatenatedNumber = number >= 0 ? 10 * number + values[index] : 10 * number - values[index];
  ArrayList branch3 = f(sum, concatenatedNumber, index + 1);

  ArrayList results = new ArrayList();

  results.addAll(add(digit, "+", branch1));
  results.addAll(add(digit, "-", branch2));
  results.addAll(add(digit, "", branch3));

  return results;
 }

 public static void main(String[] args) {

  Iterator < String > itr = f(SUM, values[0], 1).listIterator();
  //for (String string :f(TARGET_SUM, VALUES[0], 1))
  if (itr.hasNext()) {
   System.out.println(itr.next());
  }

 }
}

       
 

Perfect numbers in a given range using Java........

Here is the code ....


       
import java.util.ArrayList;
import java.util.Iterator;

import java.util.List;

public class test5 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  List d = getPerfectNumbers(1, 1000);

  Iterator itr = ((ArrayList < Integer > ) d).listIterator();

  while (itr.hasNext())
   System.out.println(itr.next());
 }


 public static java.util.List < Integer > getPerfectNumbers(int from, int to) {
  /*
    return a list of all perfect numbers in the given range inclusively.
    A perfect number is defined as a positive integer which is the sum of its positive divisors not including the number itself.
    For example: 6 is a perfect number because 6 = 1 + 2 + 3 (1, 2, 3 are divisors of 6)
    28 is also a perfect number: 28 = 1 + 2 + 4 + 7 + 14
   */
  int k;
  java.util.List < Integer > l = new ArrayList < Integer > ();
  for (int p = from; p <= to; p++) {
   k = sum(p);
   if (k == p) {
    l.add(p);

   }
  }
  return l;
 }


 public static int sum(int t) {
  int sum = 0;
  for (int i = 1; i < t; i++) {
   if (t % i == 0)
    sum = sum + i;
  }
  return sum;
 }

}

       
 

Java program to find sum of two elements closest to zero from an integer array ...

Here is the code ....


       
public class test3 {

 public static int getSumOfTwoClosestToZeroElements(int[] a) {
  /*
    Please implement this method to
    return the sum of the two elements closest to zero.
    If there are two elements equally close to zero like -2 and 2,
    consider the positive element to be "closer" to zero than the negative one.
   */
  int sum = 0;
  int h = 0;
  int[] d = new int[a.length + 1];
  d[0] = 0;

  for (int i = 1; i < a.length + 1; i++) {
   d[i] = a[h];
   h++;
  }



  int i = partition(d, 0, d.length);
  //System.out.println(i);

  for (int e = 0; e < d.length; e++)
   System.out.print(d[e] + "  ");
  System.out.println();



  int g = min(d, i + 1, d.length - 1);
  int g1 = max(d, 0, i - 1);
  //  System.out.println(g1);

  sum = g + g1;

  return sum;
 }

 public static int partition(int[] s, int i, int l) {
  int p = i;
  int a = i;
  for (int k = i + 1; k < s.length; k++) {
   if (s[p] > s[k]) {
    int temp;
    a++;
    temp = s[a];
    s[a] = s[k];
    s[k] = temp;
   }

  }
  int temp = s[a];
  s[a] = s[p];
  s[p] = temp;

  return a;
 }

 public static int min(int[] a, int f, int c) {
  int i = a[f];
  for (int s = f; s <= c; s++) {
   {
    if (i > a[s]) {
     i = a[s];

    }
   }
  }
  return i;
 }

 public static int max(int[] a, int f, int c) {
  int i = a[f];
  for (int s = f; s <= c; s++) {
   {
    if (i < a[s]) {
     i = a[s];

    }
   }
  }
  return i;
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub

  int[] w = {
   1,
   -2,
   3,
   5,
   6,
   7,
   8,
   -3,
   -6,
   2
  };
  System.out.println("The required sum is- " + getSumOfTwoClosestToZeroElements(w));
 }

}

       
 

Java program to check whether a string is palindrome or not ....

Here is the code....


       

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class test2 {

 static boolean isPalindrome(String s) {

  int y = 0;
  for (int u = s.length() - 1; u >= 0; u--) {
   if (s.charAt(y) != s.charAt(u))
    return false;
   y++;
  }

  return true;
 }

 public static void main(String args[]) throws Exception {

  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  String str = br.readLine();
  System.out.println(isPalindrome(str));
 }

}