2 차 세계 대전 일기 - 9 일 째 - 데이터 구조: 그림 (2)

2735 단어
어 제 는 그림 에 대한 지식 을 정리 한 것 으로 이 부분 은 대부분 큰 문제 형식 으로 나 타 났 으 나 코드 문제 가 나 올 가능성 도 배제 하지 않 았 다.
그림 의 전체 코드 구현
class Graph(private val vertices: ArrayList> = ArrayList(),
               private val adjacencyList: ArrayList> = ArrayList()) {
    fun createVertex(value: T): Vertex {
        val matchingVertices = vertices.filter { it.data == value }

        if (matchingVertices.isNotEmpty()) {
            return matchingVertices.last()
        }

        val vertex = Vertex(value, adjacencyList.size)
        vertices.add(vertex)
        adjacencyList.add(EdgeList(vertex))
        return vertex
    }

    fun addDirectedEdge(fromVertex: Vertex, toVertex: Vertex, weightValue: Double) {
        val edge = Edge(from = fromVertex,
                to = toVertex,
                weight = weightValue)

        fromVertex.addEdge(edge)
        val fromIndex = vertices.indexOf(fromVertex)
        adjacencyList[fromIndex].edges.add(edge)
    }

    fun addUnDirectedEdge(fromVertex: Vertex, toVertex: Vertex, weightValue: Double = 0.0) {
        addDirectedEdge(fromVertex, toVertex, weightValue)
        addDirectedEdge(toVertex, fromVertex, weightValue)

    }
    
    fun printAdjacencyList() {
        (0 until vertices.size)
                .filterNot { adjacencyList[it].edges.isEmpty() }
                .forEach { println("""${vertices[it].data} ->[${adjacencyList[it].edges.joinToString()}] """) }
    }
}

 
DFS (깊이 우선)
int visit[maxSize];
void DFS(AGraph *G, int v) {
    ArcNode *p;
    visit[v] = 1;
    cout << v << endl;
    p = G->adjlist[v].firstarc;  //  p    v     
    while (p != nullptr) {
        if (visit[p->adjvex] == 0) {
            DFS(G, p->adjvex);
            p = p->nextarc;
        }
    }
}

BFS (넓이 우선)
void BFS(AGraph *G, int v) {
    ArcNode *p;
    int que[maxSize], front = 0, rear = 0;  //       
    int j;
    cout << v << endl;
    visit[v] = 1;
    rear = (rear+1)%maxSize;  //   
    que[rear] = v;
    while (front != rear) {
        front = (front+1)%maxSize;  //     
        j = que[front];
        p = G->adjlist[j].firstarc;  // p      j     
        while (p != nullptr) {  //  p             
            if (visit[p->adjvex] == 0) {
                cout << p->adjvex << endl;
                rear = (rear+1)%maxSize;
                que[rear] = p->adjvex;
            }
            p = p->nextarc;
        }
    }
}

또한 최소 생 성 트 리, 최 단 경로 등 종합 문 제 는 스스로 예 제 를 풀 고 문제 풀이 절 차 를 정확히 찾 으 면 자신 이 원 하 는 점 수 를 얻 을 수 있다.

좋은 웹페이지 즐겨찾기