chore(Java) : add prims algorithm (#945)
parent
31fae0cfdc
commit
c63a39519a
|
@ -16,6 +16,7 @@
|
||||||
## Graphs
|
## Graphs
|
||||||
|
|
||||||
- [Dijkstras](graphs/Dijkstras.java)
|
- [Dijkstras](graphs/Dijkstras.java)
|
||||||
|
- [Prims](graphs/Prims.java)
|
||||||
|
|
||||||
## Linked Lists
|
## Linked Lists
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
/**
|
||||||
|
Approach-
|
||||||
|
It starts with an empty spanning tree. The idea is to maintain two sets of vertices.
|
||||||
|
The first set contains the vertices already included in the MST, the other set contains the vertices not yet included.
|
||||||
|
At every step, it considers all the edges that connect the two sets and picks the minimum weight edge from these edges.
|
||||||
|
After picking the edge, it moves the other endpoint of the edge to the set containing MST.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Time complexity -
|
||||||
|
Time Complexity: O(V^2)
|
||||||
|
If the input graph is represented using an adjacency list, then the time complexity of Prim’s algorithm can be reduced to O(E log V) with the help of a binary heap.
|
||||||
|
In this implementation, we are always considering the spanning tree to start from the root of the graph.
|
||||||
|
|
||||||
|
Auxiliary Space: O(V)
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.util.Scanner;
|
||||||
|
public class Prims{
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int w[][]=new int[10][10];
|
||||||
|
int min,mincost=0, u, v, flag=0;
|
||||||
|
int sol[]=new int[10];
|
||||||
|
System.out.println("Enter the number of vertices");
|
||||||
|
Scanner sc=new Scanner(System.in);
|
||||||
|
int n=sc.nextInt();
|
||||||
|
System.out.println("Enter the weighted graph");
|
||||||
|
for(int i=1;i<=n;i++)
|
||||||
|
for(int j=1;j<=n;j++)
|
||||||
|
w[i][j]=sc.nextInt();
|
||||||
|
System.out.println("Enter the source vertex");
|
||||||
|
int s=sc.nextInt();
|
||||||
|
for(int i=1;i<=n;i++) // Initialise the solution matrix with 0
|
||||||
|
sol[i]=0;
|
||||||
|
sol[s]=1; // mark the source vertex
|
||||||
|
int count=1;
|
||||||
|
while (count<=n-1)
|
||||||
|
{
|
||||||
|
min=99; // If there is no edger between any two vertex its cost is assumed to be 99
|
||||||
|
for(int i=1;i<=n;i++)
|
||||||
|
for(int j=1;j<=n;j++)
|
||||||
|
if(sol[i]==1&&sol[j]==0) //this will check the edge if not already traversed will be considered
|
||||||
|
if(i!=j && w[i][j]<min)
|
||||||
|
{
|
||||||
|
min=w[i][j]; //cost of the edge
|
||||||
|
u=i;
|
||||||
|
v=j;
|
||||||
|
}
|
||||||
|
sol[v]=1;
|
||||||
|
mincost += min; //mincost of whole graph
|
||||||
|
count++;
|
||||||
|
System.out.println(u+"->"+v+"="+min);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=1;i<=n;i++)
|
||||||
|
if(sol[i]==0)
|
||||||
|
flag=1;
|
||||||
|
if(flag==1)
|
||||||
|
System.out.println("No spanning tree");
|
||||||
|
else
|
||||||
|
System.out.println("The cost of minimum spanning tree is"+mincost);
|
||||||
|
sc.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Let us create the following graph
|
||||||
|
2 3
|
||||||
|
(0)--(1)--(2)
|
||||||
|
| / \ |
|
||||||
|
6| 8/ \5 |7
|
||||||
|
| / \ |
|
||||||
|
(3)-------(4)
|
||||||
|
9
|
||||||
|
{
|
||||||
|
{ 99, 2, 99, 6, 99 },
|
||||||
|
{ 2, 99, 3, 8, 5 },
|
||||||
|
{ 99, 3, 99, 99, 7 },
|
||||||
|
{ 6, 8, 99, 99, 9 },
|
||||||
|
{ 99, 5, 7, 9, 99 }
|
||||||
|
};
|
||||||
|
*/
|
Loading…
Reference in New Issue