Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Djecstra




1. #include<iostream>

2. #define INFINITY 999

3.

4. using namespace std;

5.

6. class Dijkstra{

7. private:

8. int adjMatrix[15][15];

9. int predecessor[15],distance[15];

10. bool mark[15]; //keep track of visited node

11. int source;

12. int numOfVertices;

13. public:

14. /*

15. * Function read() reads No of vertices, Adjacency Matrix and source

16. * Matrix from the user. The number of vertices must be greather than

17. * zero, all members of Adjacency Matrix must be postive as distances

18. * are always positive. The source vertex must also be positive from 0

19. * to noOfVertices - 1

20.

21. */

22. void read();

23.

24. /*

25. * Function initialize initializes all the data members at the begining of

26. * the execution. The distance between source to source is zero and all other

27. * distances between source and vertices are infinity. The mark is initialized

28. * to false and predecessor is initialized to -1

29. */

30.

31. void initialize();

32.

33. /*

34. * Function getClosestUnmarkedNode returns the node which is nearest from the

35. * Predecessor marked node. If the node is already marked as visited, then it search

36. * for another node.

37. */

38.

39. int getClosestUnmarkedNode();

40. /*

41. * Function calculateDistance calculates the minimum distances from the source node to

42. * Other node.

43. */

44.

45. void calculateDistance();

46. /*

47. * Function output prints the results

48. */

49.

50. void output();

51. void printPath(int);

52. };

53.

54.

55. void Dijkstra::read(){

56. cout<<"Enter the number of vertices of the graph(should be > 0)\n";

57. cin>>numOfVertices;

58. while(numOfVertices <= 0) {

59. cout<<"Enter the number of vertices of the graph(should be > 0)\n";

60. cin>>numOfVertices;

61. }

62. cout<<"Enter the adjacency matrix for the graph\n";

63. cout<<"To enter infinity enter "<<INFINITY<<endl;

64. for(int i=0;i<numOfVertices;i++) {

65. cout<<"Enter the (+ve)weights for the row "<<i<<endl;

66. for(int j=0;j<numOfVertices;j++) {

67. cin>>adjMatrix[i][j];

68. while(adjMatrix[i][j]<0) {

69. cout<<"Weights should be +ve. Enter the weight again\n";

70. cin>>adjMatrix[i][j];

71. }

72. }

73. }

74. cout<<"Enter the source vertex\n";

75. cin>>source;

76. while((source<0) && (source>numOfVertices-1)) {

77. cout<<"Source vertex should be between 0 and"<<numOfVertices-1<<endl;

78. cout<<"Enter the source vertex again\n";

79. cin>>source;

80. }

81. }

82.

83.

84. void Dijkstra::initialize(){

85. for(int i=0;i<numOfVertices;i++) {

86. mark[i] = false;

87. predecessor[i] = -1;

88. distance[i] = INFINITY;

89. }

90. distance[source]= 0;

91. }

92.

93.

94. int Dijkstra::getClosestUnmarkedNode(){

95. int minDistance = INFINITY;

96. int closestUnmarkedNode;

97. for(int i=0;i<numOfVertices;i++) {

98. if((!mark[i]) && ( minDistance >= distance[i])) {

99. minDistance = distance[i];

100. closestUnmarkedNode = i;

101. }

102. }

103. return closestUnmarkedNode;

104. }

105.

106.

107. void Dijkstra::calculateDistance(){

108. initialize();

109. int minDistance = INFINITY;

110. int closestUnmarkedNode;

111. int count = 0;

112. while(count < numOfVertices) {

113. closestUnmarkedNode = getClosestUnmarkedNode();

114. mark[closestUnmarkedNode] = true;

115. for(int i=0;i<numOfVertices;i++) {

116. if((!mark[i]) && (adjMatrix[closestUnmarkedNode][i]>0) ) {

117. if(distance[i] > distance[closestUnmarkedNode]+adjMatrix[closestUnmarkedNode][i]) {

118. distance[i] = distance[closestUnmarkedNode]+adjMatrix[closestUnmarkedNode][i];

119. predecessor[i] = closestUnmarkedNode;

120. }

121. }

122. }

123. count++;

124. }

125. }

126.

127.

128. void Dijkstra::printPath(int node){

129. if(node == source)

130. cout<<(char)(node + 97)<<"..";

131. else if(predecessor[node] == -1)

132. cout<<"No path from “<<source<<”to "<<(char)(node + 97)<<endl;

133. else {

134. printPath(predecessor[node]);

135. cout<<(char) (node + 97)<<"..";

136. }

137. }

138.

139.

140. void Dijkstra::output(){

141. for(int i=0;i<numOfVertices;i++) {

142. if(i == source)

143. cout<<(char)(source + 97)<<".."<<source;

144. else

145. printPath(i);

146. cout<<"->"<<distance[i]<<endl;

147. }

148. }

149.

150.

151. int main(){

152. Dijkstra G;

153. G.read();

154. G.calculateDistance();

155. G.output();

156. return 0;

157. }

 

 

BFS

#include <iostream>

#include <ctime>

using namespace std;

 

/****************************************************************

 

Performs the Breadth-First Graph search for both directed and

undirected graphs. This algorithm explores all the findable nodes

in "layers".

@author Bibek Subedi

*****************************************************************/

 

/****************************************************************

 

Class Queue represent a Queue data structure which is First In

First Out [FIFO] structured. It has operations like Enqueue which

adds an element at the rear side and Dequeue which removes the

element from front.

 

*****************************************************************/

 

struct node {

int info;

node *next;

};

 

class Queue {

private:

node *front;

node *rear;

public:

Queue();

~Queue();

bool isEmpty();

void enqueue(int);

int dequeue();

void display();

 

};

 

void Queue::display(){

node *p = new node;

p = front;

if(front == NULL){

cout<<"\nNothing to Display\n";

}else{

while(p!=NULL){

cout<<endl<<p->info;

p = p->next;

}

}

}

 

Queue::Queue() {

front = NULL;

rear = NULL;

}

 

Queue::~Queue() {

delete front;

}

 

void Queue::enqueue(int data) {

node *temp = new node();

temp->info = data;

temp->next = NULL;

if(front == NULL){

front = temp;

}else{

rear->next = temp;

}

rear = temp;

}

 

int Queue::dequeue() {

node *temp = new node();

int value;

if(front == NULL){

cout<<"\nQueue is Emtpty\n";

}else{

temp = front;

value = temp->info;

front = front->next;

delete temp;

}

return value;

}

 

bool Queue::isEmpty() {

return (front == NULL);

}

 

 

/************************************************************

 

Class Graph represents a Graph [V,E] having vertices V and

edges E.

 

************************************************************/

class Graph {

private:

int n; /// n is the number of vertices in the graph

int **A; /// A stores the edges between two vertices

public:

Graph(int size = 2);

~Graph();

bool isConnected(int, int);

void addEdge(int u, int v);

void BFS(int );

};

 

Graph::Graph(int size) {

int i, j;

if (size < 2) n = 2;

else n = size;

A = new int*[n];

for (i = 0; i < n; ++i)

A[i] = new int[n];

for (i = 0; i < n; ++i)

for (j = 0; j < n; ++j)

A[i][j] = 0;

}

 

Graph::~Graph() {

for (int i = 0; i < n; ++i)

delete [] A[i];

delete [] A;

}

 

 

/******************************************************

Checks if two given vertices are connected by an edge

@param u vertex

@param v vertex

@return true if connected false if not connected

******************************************************/

bool Graph::isConnected(int u, int v) {

return (A[u-1][v-1] == 1);

}

 

/*****************************************************

adds an edge E to the graph G.

@param u vertex

@param v vertex

*****************************************************/

void Graph::addEdge(int u, int v) {

A[u-1][v-1] = A[v-1][u-1] = 1;

}

 

/*****************************************************

performs Breadth First Search

@param s initial vertex

*****************************************************/

void Graph::BFS(int s) {

Queue Q;

 

/** Keeps track of explored vertices */

bool *explored = new bool[n+1];

 

/** Initailized all vertices as unexplored */

for (int i = 1; i <= n; ++i)

explored[i] = false;

 

/** Push initial vertex to the queue */

Q.enqueue(s);

explored[s] = true; /** mark it as explored */

cout<< "Breadth first Search starting from vertex ";

cout<< s << " : " << endl;

 

/** Unless the queue is empty */

while (!Q.isEmpty()) {

/** Pop the vertex from the queue */

int v = Q.dequeue();

 

/** display the explored vertices */

cout<< v << " ";

 

/** From the explored vertex v try to explore all the

connected vertices */

for (int w = 1; w <= n; ++w)

 

/** Explores the vertex w if it is connected to v

and and if it is unexplored */

if (isConnected(v, w) && !explored[w]) {

/** adds the vertex w to the queue */

Q.enqueue(w);

/** marks the vertex w as visited */

explored[w] = true;

}

}

cout<< endl;

delete [] explored;

}

 

int main() {

 

/** Creates a graph with 12 vertices */

Graph g(12);

 

/** Adds edges to the graph */

g.addEdge(1, 2); g.addEdge(1, 3);

g.addEdge(2, 4); g.addEdge(3, 4);

g.addEdge(3, 6); g.addEdge(4 ,7);

g.addEdge(5, 6); g.addEdge(5, 7);

clock_t t1;

t1 = clock();

 

/** Explores all vertices findable from vertex 1 */

g.BFS(1);

float diff = (double)(clock() - t1)/CLOCKS_PER_SEC ;

cout<<endl<< "The time taken for Breadth first search: "<< diff << endl;

}

 

DFS

#include <iostream>

#include <ctime>

#include <malloc.h>

using namespace std;

struct node{

int info;

struct node *next;

};

 

class stack{

struct node *top;

public:

stack();

void push(int);

int pop();

bool isEmpty();

void display();

};

 

stack::stack(){

top = NULL;

}

 

void stack::push(int data){

node *p;

if((p=(node*)malloc(sizeof(node)))==NULL){

cout<<"Memory Exhausted";

exit(0);

}

p = new node;

p->info = data;

p->next = NULL;

if(top!=NULL){

p->next = top;

}

top = p;

}

 

int stack::pop(){

struct node *temp;

int value;

if(top==NULL){

cout<<"\nThe stack is Empty"<<endl;

}else{

temp = top;

top = top->next;

value = temp->info;

delete temp;

}

return value;

}

 

bool stack::isEmpty(){

return (top == NULL);

}

 

void stack::display(){

struct node *p = top;

if(top==NULL){

cout<<"\nNothing to Display\n";

}else{

cout<<"\nThe contents of Stack\n";

while(p!=NULL){

cout<<p->info<<endl;

p = p->next;

}

}

}

 

class Graph {

private:

int n;

int **A;

public:

Graph(int size = 2);

~Graph();

bool isConnected(int, int);

void addEdge(int x, int y);

void DFS(int , int);

};

 

Graph::Graph(int size) {

int i, j;

if (size < 2) n = 2;

else n = size;

A = new int*[n];

for (i = 0; i < n; ++i)

A[i] = new int[n];

for (i = 0; i < n; ++i)

for (j = 0; j < n; ++j)

A[i][j] = 0;

}

 

Graph::~Graph() {

for (int i = 0; i < n; ++i)

delete [] A[i];

delete [] A;

}

 

bool Graph::isConnected(int x, int y) {

return (A[x-1][y-1] == 1);

}

 

void Graph::addEdge(int x, int y) {

A[x-1][y-1] = A[y-1][x-1] = 1;

}

 

void Graph::DFS(int x, int required){

stack s;

bool *visited = new bool[n+1];

int i;

for(i = 0; i <= n; i++)

visited[i] = false;

s.push(x);

visited[x] = true;

if(x == required) return;

cout<< "Depth first Search starting from vertex ";

cout<< x << " : " << endl;

while(!s.isEmpty()){

int k = s.pop();

if(k == required) break;

cout<<k<<" ";

for (i = n; i >= 0 ; --i)

if (isConnected(k, i) && !visited[i]) {

s.push(i);

visited[i] = true;

}

}

cout<<endl;

delete [] visited;

}

 

int main(){

Graph g(8);

g.addEdge(1, 2); g.addEdge(1, 3); g.addEdge(1, 4);

g.addEdge(2, 5); g.addEdge(2, 6); g.addEdge(4, 7);

g.addEdge(4, 8);

g.DFS(1, 4);

return 0;

}

Trees


Поделиться:

Дата добавления: 2015-09-15; просмотров: 161; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты