Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

هل توجد حافة

الدرس 6 من 14 في دورة المخططات - سلسلة هياكل البيانات #9 على Coddy.

أبسط سؤال يمكن طرحه على الرسم البياني هو "هل هذان الرأسان متصلان؟". باستخدام قائمة التجاور (adjacency list) الخاصة بنا، تكون الإجابة عبارة عن عملية بحث واحدة في الخريطة بالإضافة إلى فحص القائمة: ابحث عن جيران u وتحقق مما إذا كان v موجوداً في تلك القائمة.

إذا لم يكن u موجوداً في الرسم البياني أصلاً، فلا توجد قائمة لفحصها، لذا قم بإرجاع false. بما أن addEdge قامت بتوصيل الاتصال في كلا الاتجاهين، فأنت تحتاج فقط إلى التحقق من جانب واحد: إذا كان v ضمن جيران u، فبناءً على ذلك يكون u ضمن جيران v.

الآن قم بكتابتها.

challenge icon

التحدي

سهل

أضف طريقة hasEdge إلى فئة Graph.

تأخذ هذه الطريقة عددين صحيحين u و v وتعيد true إذا كانت هناك حافة بينهما، و false بخلاف ذلك.

إذا لم يكن u موجوداً في vertices، فقم بإعادة false. بخلاف ذلك، قم بإعادة ما إذا كان v موجوداً في قائمة جيران u.

جرّب بنفسك

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "graph.h"

static int _cmp_int(const void* a, const void* b) {
    int ai = *(const int*)a, bi = *(const int*)b;
    return (ai > bi) - (ai < bi);
}

int main() {
    Graph g;
    Graph_init(&g);
    char line[1024];
    while (fgets(line, sizeof(line), stdin)) {
        line[strcspn(line, "\r\n")] = '\0';
        char* cmd = strtok(line, " \t");
        if (!cmd) continue;
        if (strcmp(cmd, "verticesEmpty") == 0) { printf("%s\n", g.vertexCount == 0 ? "true" : "false"); }
        if (strcmp(cmd, "hasVertex") == 0) { char* arg = strtok(NULL, " \t"); if (arg) printf("%s\n", Graph_indexOf(&g, atoi(arg)) != -1 ? "true" : "false"); }
        if (strcmp(cmd, "addVertex") == 0) { char* arg = strtok(NULL, " \t"); if (arg) Graph_addVertex(&g, atoi(arg)); }
        if (strcmp(cmd, "addEdge") == 0) { char* a1 = strtok(NULL, " \t"); char* a2 = strtok(NULL, " \t"); if (a1 && a2) Graph_addEdge(&g, atoi(a1), atoi(a2)); }
        if (strcmp(cmd, "degree") == 0) {
            char* arg = strtok(NULL, " \t");
            if (arg) {
                int k = atoi(arg);
                int ki = Graph_indexOf(&g, k);
                printf("%d\n", ki == -1 ? 0 : g.vertices[ki].n);
            }
        }
        if (strcmp(cmd, "hasEdge") == 0) { char* a1 = strtok(NULL, " \t"); char* a2 = strtok(NULL, " \t"); if (a1 && a2) printf("%s\n", Graph_hasEdge(&g, atoi(a1), atoi(a2)) ? "true" : "false"); }
    }
    return 0;
}

جميع دروس المخططات - سلسلة هياكل البيانات #9