data structure practice
과제12_그래프
greentealover1
2023. 5. 21. 00:50
1.(1) 교재에 있는 그래프에 대하여 정점 3에서 출발하여 너비 우선 탐색을 한경우의 방문 순서를 쓰세요. (3) 정점 3에서 출발하여 깊이 우선 탐색을 한 경우의 방문순서를 쓰세요
풀이: (1)-3,1,4,5,0,2,7,8,9,6 (3)-3,1,0,2,4,5,6,7,8,9
2. 위와 같이 그래프가 주어졌을 때, V(정점 집합), E(간선 집합)을 쓰세요. Adjacent list(인접 리스트)를 쓰세요. Topological sort(위상 정렬)하여 정점을 나열하세요. 위상 정렬 알고리즘 pseudo code로 작성하세요.
풀이: (1)-V={A,B,C,D},E={<A,B>,<B,D>,<C,D>}
(2)-adjacent list=A->B|null
B->D|null
C->D|null
D|null
(3)-topological sort: A,B,C,D
(4)-각 노드의 진입차수 파악하기->진입차수가 0인 노드에서 출발->선택한 노드와 연결된 모든 간선을 제거하고 연결된 선택 노드의 진입차수 -1하기->다음 과정을 반복하며 차례대로 sort한다.
3.교재 프로그램 11.11, 11.12 프로그램을 본인 코드로 옮겨 봅니다. • 주어진 ‘graph.txt’ 파일을 일고, 이를 너비 우선 탐색하여 교재와 같은 결과를 확인합니다.
#include <iostream>
#include <fstream>
#define MAX_VTXS 256
#define MAX_QUEUE_SIZE 100
using namespace std;
class Circularqueue {
protected:
int front;
int rear;
int data[MAX_QUEUE_SIZE];
public:
Circularqueue() { front = rear = 0; }
bool isempty() { return front == rear; }
bool isfull() { return (rear + 1) % MAX_QUEUE_SIZE == front; }
void enqueue(int val) {
if (!isfull()) {
rear = (rear + 1) % MAX_QUEUE_SIZE;
data[rear] = val;
}
}
int dequeue() {
if (!isempty()) {
front = (front + 1) % MAX_QUEUE_SIZE;
return data[front];
}
}
void display() {
cout << "큐의 내용: ";
int maxi = (front < rear) ? rear : rear + MAX_QUEUE_SIZE;
for (int i = front + 1; i <= maxi; i++)
cout << data[i % MAX_QUEUE_SIZE];
}
};
class AdjMatGraph {
protected:
int size;
char vertices[MAX_VTXS];
int adj[MAX_VTXS][MAX_VTXS];
public:
AdjMatGraph() { reset(); }
void reset() {
size = 0;
for (int i = 0; i < MAX_VTXS; i++) {
for (int j = 0; j < MAX_VTXS; j++)
setEdge(i, j, 0);
}
}
bool isempty() { return size == 0; }
bool isfull() { return size >= MAX_VTXS; }
char getVertex(int i) { return vertices[i]; }
int getEdge(int i, int j) { return adj[i][j]; }
void setEdge(int i, int j, int val) { adj[i][j] = val; }
void insertVertex(char name) {
if (!isfull())
vertices[size++] = name;
else
cout << "Error: 그래프 정점 개수 초과했음..." << endl;
}
void insertEdge(int u, int v) {
setEdge(u, v, 1);
setEdge(v, u, 1);
}
void display() {
cout << size << endl;
for (int i = 0; i < size; i++) {
cout << getVertex(i);
for (int j = 0; j < size; j++)
cout << " " << getEdge(i, j);
cout << endl;
}
}
};
class SrchAMGraph : public AdjMatGraph {
bool visited[MAX_VTXS];
public:
void resetVisited() {
for (int i = 0; i < size; i++)
visited[i] = false;
}
bool isLinked(int u, int v) { return getEdge(u, v) != 0; }
void BFS(int v) {
visited[v] = true;
cout << getVertex(v);
Circularqueue que;
que.enqueue(v);
while (!que.isempty()) {
int v = que.dequeue();
for (int w = 0; w < size; w++) {
if (isLinked(v, w) && visited[w] == false) {
visited[w] = true;
cout << " " << getVertex(w);
que.enqueue(w);
}
}
}
}
};
int main() {
int num, val;
char str;
SrchAMGraph g;
ifstream inputFile("graph.txt");
inputFile >> num;
for (int i = 0; i < num; i++) {
inputFile >> str;
g.insertVertex(str);
for (int j = 0; j < num; j++) {
inputFile >> val;
if (val != 0)
g.insertEdge(i, j);
}
}
inputFile.close();
g.display();
cout << "BFS==>";
g.resetVisited();
g.BFS(0);
cout << endl;
}