CXXGraph هي مكتبة C++ شاملة تدير خوارزميات الرسم البياني. تعمل مكتبة الرأس فقط هذه كبديل لمكتبة Boost Graph Library (BGL).
نحن نبحث عن:
إذا كنت مهتما، يرجى الاتصال بنا على [email protected] أو المساهمة في هذا المشروع. نحن في انتظاركم!
مكتمل | وصف | تاريخ الانتهاء |
---|---|---|
✔️ | الإصدار 0.4.0 | 7 أكتوبر 2022 |
✔️ | الإصدار 0.5.0 | 23 مارس 2023 |
✔️ | الإصدار المستقر الأول 1.0.0 | 28 مارس 2023 |
✔️ | الإصدار 1.0.1 | 7 مايو 2023 |
✔️ | الإصدار 1.1.0 | 8 مايو 2023 |
✔️ | الإصدار المستقر 2.0.0 | 1 يونيو 2023 |
✔️ | الإصدار المستقر 3.0.0 | 3 نوفمبر 2023 |
✔️ | الإصدار 3.1.0 | 9 يناير 2023 |
تقديم الرسم البياني الفائق رقم 122 | سيتم تحديده لاحقًا | |
الإصدار المستقر 4.0.0 | سيتم تحديده لاحقًا |
للتثبيت على أنظمة Unix/Linux، قم بتنفيذ ما يلي من سطر الأوامر:
$ sudo tar xjf CXXGraph-{version}.tar.bz2
لإلغاء التثبيت:
$ sudo rm -f /usr/include/Graph.hpp /usr/include/CXXGraph*
للتثبيت على أنظمة Fedora/CentOS/RedHat، قم بتنفيذ ما يلي من سطر الأوامر:
$ sudo rpm -ivh CXXGraph-{version}.noarch.rpm
لإلغاء التثبيت:
$ sudo rpm -e CXXGraph-{version}
للتثبيت على أنظمة Debian/Ubuntu، قم بتنفيذ ما يلي من سطر الأوامر:
$ sudo dpkg -i CXXGraph_{version}.deb
لإلغاء التثبيت:
$ sudo apt-get remove CXXGraph
بالنسبة لعمليات التثبيت ذاتية التجميع باستخدام CMake، قم بتنفيذ ما يلي من سطر الأوامر بمجرد اكتمال التجميع:
$ sudo make install
يمكن العثور على شرح الفئات في قسم الفئات في وثائق دوكسيجن
لاستخدام المكتبة، ما عليك سوى وضع ملف الرأس في المكان الذي تريده. الأمر بهذه السهولة!
العمل قيد التقدم
يتطلب اختبار الوحدة الإصدار 3.9 من CMake والإصدارات الأحدث ومكتبة GoogleTest .
اختبار جوجل
git clone https://github.com/google/googletest.git
cd googletest # Main directory of the cloned repository
mkdir -p build # Create a directory to hold the build output
cd build
cmake .. # Generate native build scripts for GoogleTest
make # Compile
sudo make install # Install in /usr/local/ by default
من الدليل الأساسي:
mkdir -p build # Create a directory to hold the build output
cd build # Enter the build folder
cmake -DTEST=ON .. # Generate native build scripts for GoogleTest,
make # Compile
بعد تجميع البنية، قم بتشغيل "test_exe" القابل للتنفيذ في دليل "build" باستخدام الأمر التالي:
./test_exe
يتطلب المعيار CMake 3.9 والإصدارات الأحدث، ومكتبة GoogleTest ، ومكتبة Google Benchmark .
جوجل المعيار
# Check out the library
$ git clone https://github.com/google/benchmark.git
# Google Benchmark requires GoogleTest as a dependency. Add the source tree as a subdirectory
$ git clone https://github.com/google/googletest.git benchmark/googletest
# Go to the library's root directory
$ cd benchmark
# Make a build directory to place the build output
$ cmake -E make_directory " build "
# Generate the build system files with CMake
$ cmake -E chdir " build " cmake -DCMAKE_BUILD_TYPE=Release ../
# If starting with CMake 3.13, you can use the following:
# cmake -DCMAKE_BUILD_TYPE=Release -S . -B "build"
# Build the library
$ cmake --build " build " --config Release
# Install the library
$ sudo cmake --build " build " --config Release --target install
من الدليل الأساسي:
mkdir -p build # Create a directory to hold the build output
cd build # Enter the build folder
cmake -DBENCHMARK=ON .. # Generate native build scripts for Google Benchmark
make # Compile
بعد تجميع البنية، قم بتشغيل "المعيار" القابل للتنفيذ في دليل "الإنشاء" باستخدام الأمر التالي:
./benchmark
يمكنك التحقق من نتيجة الاختبار باستخدام هذا الرابط.
لإنشاء حزمة tarball، قم بتنفيذ ما يلي من سطر الأوامر:
# Enter Packaging Directory
$ cd packaging
# Execute the script to generate tarballs
$ ./tarballs.sh
لإنشاء حزمة RPM، قم بتنفيذ ما يلي من سطر الأوامر:
# Enter Packaging Directory
$ cd packaging/rpm
# Execute the script to generate tarballs
$ ./make_rpm.sh
لإنشاء حزمة deb، قم بتنفيذ ما يلي من سطر الأوامر:
# Enter Packaging Directory
$ cd packaging/deb
# Execute the script to generate tarballs
$ ./make_deb.sh
يتم استخدام خوارزمية الرسم البياني Dijkstras لأقصر مسار (أقصر مسار Dijkstras) [خوارزمية Dijkstras] (https://www.interviewbit.com/blog/find-shortest-path-dijkstras-algorithm/) للعثور على أقصر مسار من العقدة المصدر إلى جميع العقد الأخرى التي يمكن الوصول إليها في الرسم البياني. تفترض الخوارزمية في البداية أن جميع العقد لا يمكن الوصول إليها من العقدة المصدر المحددة، لذلك نحدد المسافات بين جميع العقد على أنها لا نهاية. (اللانهاية) من العقدة المصدر (تشير INF / اللانهاية إلى عدم القدرة على الوصول).
اطلب التخصص في خوارزمية ديكسترا.
عندما تكون أوزان الحواف عبارة عن أعداد صحيحة صغيرة (محدودة بمعلمة C )، يمكن استخدام قوائم الانتظار المتخصصة التي تستفيد من هذه الحقيقة لتسريع خوارزمية Dijkstra. الخوارزمية الأولى من هذا النوع كانت خوارزمية Dial (Dial 1969) للرسوم البيانية ذات أوزان الحواف ذات الأعداد الصحيحة الموجبة، والتي تستخدم قائمة انتظار الجرافة للحصول على وقت التشغيل O(|E|+|V|C) .(المصدر ويكيبيديا)
فيما يلي خوارزمية كاملة:
على هذا الرابط يمكنك العثور على الرسوم التوضيحية خطوة بخطوة.
خوارزمية Prim هي خوارزمية جشعة تبحث عن الحد الأدنى من الشجرة الممتدة للرسم البياني الموزون غير الموجه. هذا يعني أنه يعثر على مجموعة فرعية من الحواف التي تشكل شجرة تتضمن كل قمة، حيث يتم تقليل الوزن الإجمالي لجميع الحواف في الشجرة. تعمل الخوارزمية عن طريق بناء هذه الشجرة، قمة واحدة في كل مرة، من قمة بداية اعتباطية، وفي كل خطوة تضيف أرخص اتصال ممكن من الشجرة إلى قمة أخرى.
خطوات:
(بحث العرض الأول) خوارزمية بحث العرض الأول(بحث العرض الأول) بحث العرض الأول ، والذي يُشار إليه أيضًا باسم BFS ، هو خوارزمية اجتياز الرسم البياني. التعقيد الزمني O(|V| + |E|) حيث V هو عدد القمم وE هو عدد الحواف في الرسم البياني. تطبيقات بحث الاتساع الأول هي:
وهناك الكثير غيرها...
(بحث العمق الأول) خوارزمية بحث العمق الأول (بحث العمق الأول) بحث العمق الأول ، والذي يُشار إليه أيضًا باسم DFS ، هو خوارزمية اجتياز الرسم البياني. التعقيد الزمني O(|V| + |E|) حيث V هو عدد القمم وE هو عدد الحواف في الرسم البياني. تطبيق بحث العمق الأول هو:
وهناك الكثير غيرها...
أفضل بحث أول أفضل بحث أول هو فئة من خوارزميات البحث التي تجتاز الرسم البياني من خلال استكشاف العقدة الواعدة التي تم اختيارها وفقًا لوظيفة التقييم. التعقيد الزمني الأسوأ هو O(n * log n) حيث n هو عدد العقد في الرسم البياني.
الدورة (نظرية الرسم البياني)
يمكن تحديد وجود دورة في الرسوم البيانية الموجهة وغير الموجهة من خلال ما إذا كان بحث العمق الأول (DFS) يجد حافة تشير إلى سلف القمة الحالية (التي تحتوي على حافة خلفية). جميع الحواف الخلفية التي يتخطاها DFS هي جزء من الدورات. في الرسم البياني غير الموجه، لا ينبغي احتساب الحافة إلى أصل العقدة كحافة خلفية، ولكن العثور على أي قمة أخرى تمت زيارتها بالفعل سيشير إلى حافة خلفية. في حالة الرسوم البيانية غير الموجهة، يلزم وقت O(n) فقط للعثور على دورة في الرسم البياني n-vertex، نظرًا لأن الحواف n − 1 على الأكثر يمكن أن تكون حواف شجرة.
سوف تكتشف العديد من خوارزميات الفرز الطوبولوجي الدورات أيضًا، نظرًا لأن هذه تمثل عقبات أمام وجود الترتيب الطوبولوجي. وأيضًا، إذا تم تقسيم الرسم البياني الموجه إلى مكونات مرتبطة بقوة، فإن الدورات موجودة فقط داخل المكونات وليس بينها، نظرًا لأن الدورات مرتبطة بقوة.
بالنسبة للرسوم البيانية الموجهة، يمكن استخدام الخوارزميات القائمة على الرسائل الموزعة. تعتمد هذه الخوارزميات على فكرة أن الرسالة المرسلة من خلال قمة ما في الدورة سوف تعود إلى نفسها. تعد خوارزميات اكتشاف الدورة الموزعة مفيدة لمعالجة الرسوم البيانية واسعة النطاق باستخدام نظام معالجة الرسوم البيانية الموزعة على مجموعة كمبيوتر (أو كمبيوتر فائق السرعة).
تتضمن تطبيقات اكتشاف الدورة استخدام الرسوم البيانية للانتظار للكشف عن حالات التوقف التام في الأنظمة المتزامنة.
يمكن استخدام خوارزمية Bellman-Ford للعثور على أقصر مسافة بين المصدر والعقدة المستهدفة. التعقيد الزمني O(|V| . |E|) حيث V هو عدد القمم وE هو عدد الحواف في الرسم البياني وهو أعلى من خوارزمية Dijkstra لأقصر مسار. التعقيد الزمني لخوارزمية ديكسترا هو O(|E| + |V| log |v| ). ميزة بيلمان فورد على ديكسترا هي أنه يمكنه التعامل مع الرسوم البيانية ذات أوزان الحواف السالبة. علاوة على ذلك، إذا كان الرسم البياني يحتوي على دورة وزن سالبة، فيمكن للخوارزمية اكتشاف وجود الدورة السلبية والإبلاغ عنها.
يقدم هذا الفيديو نظرة عامة لطيفة على تنفيذ الخوارزمية. تقدم هذه المحاضرة في معهد ماساتشوستس للتكنولوجيا دليلاً على صحة بيلمان فورد وقدرته على اكتشاف الدورات السلبية. التطبيقات:
خوارزمية فلويد وارشال
نقوم بتهيئة مصفوفة الحل بنفس مصفوفة الرسم البياني للإدخال كخطوة أولى. ثم نقوم بتحديث مصفوفة الحل من خلال اعتبار جميع القمم بمثابة قمة متوسطة. تتمثل الفكرة في اختيار جميع القمم واحدًا تلو الآخر وتحديث جميع المسارات الأقصر التي تتضمن الرأس المنتقى كرأس متوسط في أقصر مسار. عندما نختار الرأس رقم k كرأس متوسط، فقد اعتبرنا بالفعل الرؤوس {0، 1، 2، .. k-1} رؤوسًا متوسطة. لكل زوج (i, j) من رؤوس المصدر والوجهة على التوالي، هناك حالتان محتملتان.
تخفيض متعدية
يتم استخدام هذه الخوارزمية لإنشاء رسم بياني موجه بنفس إمكانية الوصول ويرضي الإغلاق المتعدي، مع أقل عدد ممكن من الحواف. وبشكل أكثر واقعية، فإنه ينشئ الحد الأدنى من الرسم البياني المكافئ مع أقل عدد ممكن من الحواف، مما يؤدي إلى إزالة مسارات "الدائرة القصيرة" من خلال الرسم البياني.
يتم ذلك عن طريق التكرار خلال كل زوج من العقد، والتحقق لمعرفة ما إذا كانت هناك حافتان تؤديان إلى خارج العقدة الأولى أو خارج العقدة الأخيرة، وإزالة حافة زوج العقدة إذا كانت موجودة.
في الكود الكاذب: foreach x في الرسم البياني. القمم foreach y في الرسم البياني. القمم foreach z في الرسم البياني. القمم تحذف الحافة xz إذا كانت الحواف xy و yz موجودة
يتضمن تنفيذنا بوابات تقوم بالتحقق المبكر من الحواف في أماكن متعددة، مما يمنحها وقت تشغيل أسرع قليلاً من الكود الكاذب المكعب هنا.
يمكن استخدام خوارزمية كروسكال للعثور على الحد الأدنى من الغابة الممتدة للرسم البياني الموزون للحافة غير الموجهة. التعقيد الزمني O(E log E) = O(E log V) حيث V هو عدد القمم وE هو عدد الحواف في الرسم البياني. الحد الرئيسي للسرعة لهذه الخوارزمية هو فرز الحواف.
للحصول على فهم سريع لإجراءات الخوارزمية، شاهد هذا الفيديو. بعض تطبيقات الحياة الواقعية هي:
الخوارزميات الأخرى للعثور على الحد الأدنى من الغابة الممتدة هي خوارزمية Prim أو خوارزمية Borůvka.
خوارزمية Borůvka هي خوارزمية جشعة يمكن استخدامها للعثور على الحد الأدنى من الشجرة الممتدة في الرسم البياني، أو الحد الأدنى من الغابة الممتدة في حالة الرسم البياني غير المتصل.
تبدأ الخوارزمية بإيجاد الحد الأدنى من الوزن لكل قمة في الرسم البياني، وإضافة كل تلك الحواف إلى الغابة. ثم، يكرر عملية مماثلة للعثور على الحد الأدنى للوزن من كل شجرة تم إنشاؤها حتى الآن إلى شجرة مختلفة، وإضافة كل تلك الحواف إلى الغابة. يؤدي كل تكرار لهذه العملية إلى تقليل عدد الأشجار، داخل كل مكون متصل من الرسم البياني، إلى نصف هذه القيمة السابقة على الأكثر، لذلك بعد العديد من التكرارات اللوغاريتمية، تنتهي العملية. عندما يحدث ذلك، فإن مجموعة الحواف التي أضافتها تشكل الحد الأدنى من الغابة الممتدة.
يمكن إظهار خوارزمية Borůvka أنها تأخذ تكرارات O(log V) للحلقة الخارجية حتى تنتهي، وبالتالي تعمل في الوقت O(E log V)، حيث E هو عدد الحواف، وV هو عدد القمم في G (بافتراض E ≥ V).
التعريف الرياضي للمشكلة: اجعل G هي مجموعة العقد في الرسم البياني و n هي عقدة معينة في تلك المجموعة. دع C تكون المجموعة الفرعية غير الصارمة من G التي تحتوي على كل من n وجميع العقد التي يمكن الوصول إليها من n، ودع C' تكون مكملة لها. هناك مجموعة ثالثة M، وهي المجموعة الفرعية غير الصارمة من C التي تحتوي على جميع العقد التي يمكن الوصول إليها من أي عقدة في C'. تتكون المشكلة من العثور على جميع العقد التي تنتمي إلى C ولكن ليس إلى M.
الخوارزمية المطبقة حاليًا:
طلب:
يتم استخدام هذه الخوارزمية في أنظمة تجميع البيانات المهملة لتحديد الكائنات الأخرى التي يجب تحريرها، نظرًا لوجود كائن واحد على وشك الإصدار.
خوارزمية Ford-Fulkerson هي خوارزمية جشعة لإيجاد الحد الأقصى للتدفق في شبكة التدفق. الفكرة وراء الخوارزمية هي كما يلي: طالما أن هناك مسارًا من المصدر (عقدة البداية) إلى الحوض (عقدة النهاية)، مع سعة متاحة على جميع حواف المسار، فإننا نرسل التدفق على طول أحد المسارات. ثم نجد طريقا آخر، وهكذا. يُطلق على المسار ذو السعة المتاحة اسم المسار المعزز.
خوارزمية Kosaraju هي خوارزمية زمنية خطية للعثور على المكونات المرتبطة بقوة في الرسم البياني الموجه. يعتمد هذا على فكرة أنه إذا كان الشخص قادرًا على الوصول إلى قمة v بدءًا من قمة u، فيجب أن يكون قادرًا على الوصول إلى قمة u بدءًا من قمة v وإذا كان هذا هو الحال، فيمكن للمرء أن يقول أن الرؤوس u وv هما مرتبطان بقوة - إنهما في رسم بياني فرعي مرتبط بقوة. وفيما يلي مثال:
1). قم بإنشاء مكدس فارغ "S" وقم باجتياز DFS للرسم البياني. في اجتياز DFS، بعد استدعاء DFS العودي للقمم المجاورة للرأس، ادفع الرأس إلى المكدس. 2). عكس الاتجاهات لجميع الأقواس للحصول على الرسم البياني تبديل. 3). واحدًا تلو الآخر، قم بإخراج قمة من S بينما S ليست فارغة. دع الرأس المنبثق يكون "v". خذ v كمصدر وقم بتنفيذ DFS (اتصل بـ DFSUtil(v)). يقوم DFS بدءًا من v بطباعة المكون المتصل بقوة بـ v.
تعثر خوارزمية خان على الترتيب الطوبولوجي عن طريق إزالة العقد في الرسم البياني بشكل متكرر والتي ليس لها حواف واردة. عند إزالة عقدة من الرسم البياني، تتم إضافتها إلى الترتيب الطوبولوجي وتتم إزالة جميع حوافها مما يسمح باختيار المجموعة التالية من العقد بدون حواف واردة.
خوارزمية تلوين باول الويلزية هي خوارزمية تلوين قمة الجشع. تُستخدم هذه الخوارزمية أيضًا للعثور على الرقم اللوني للرسم البياني.
تتكون خوارزمية ويلش باول من الخطوات التالية:
تقوم الخوارزمية بإرجاع نتيجة std::map<Node, int> التي تقوم بتعيين كل عقدة إلى لون مرتب حسب الأعداد الصحيحة. يمكن للمستخدمين أيضًا الاستعلام عن الحد الأدنى من الترتيب اللوني للرسم البياني عن طريق الاستعلام عن أعلى قيمة من الخريطة الناتجة.
std::map<Node, int > result = graph.welshPowellColoring();
auto chromatic_color = std::max_element(result.begin(), result.end(),
[]( const auto & lhs, const auto & rhs) {
return lhs. second < rhs. second ;
}
الحد الأدنى للتلوين يبدأ من 1 بدلاً من 0.
تفترض الخوارزمية أن الرسم البياني غير موجه. يتم ربط جميع المصادر والإلهامات في إعلان الخوارزمية وحالات الاختبار.
يقسم التقسيم الرأسي حواف الرسم البياني إلى أقسام متساوية الحجم. يتم أيضًا وضع القمم التي تحمل نقاط نهاية الحافة في نفس القسم مثل الحافة نفسها. ومع ذلك، فإن القمم ليست فريدة عبر الأقسام وقد يتعين تكرارها (قصها)، وذلك بسبب توزيع حوافها عبر أقسام مختلفة.
يحدد عامل النسخ عدد الرؤوس التي يتم نسخها على أجهزة الكمبيوتر مقارنة بعدد الرؤوس في الرسم البياني الأصلي للإدخال.
هذه الخوارزمية عبارة عن قطع قمة بسيط بأسلوب Round-Robin. يأخذ حواف الرسم البياني الأصلية ويخصصها للأقسام، ويقسمها بحجم متساوٍ (أو مشابه). لا تهتم هذه الخوارزمية بالتحسين في النسخ المتماثل الرأسي (عامل النسخ المتماثل) ولكنها تعمل فقط على موازنة الحافة في الأقسام.
تستخدم خوارزميات التقسيم الجشعة التاريخ الكامل لتخصيصات الحافة لاتخاذ القرار التالي. تقوم الخوارزمية بتخزين مجموعة الأقسام A(v) التي تم تعيين كل قمة v تمت ملاحظتها بالفعل وأحجام القسم الحالية. عند معالجة الحافة e ∈ E التي تربط القمم vi، vj ∈ V، تتبع الخوارزمية الجشعة هذه المجموعة البسيطة من القواعد:
خوارزمية الدرجة العالية (المكررة أولاً) (HDRF) هي خوارزمية جشعة للقطع الرأسي كما هو موضح في هذه الورقة. تحاول هذه الخوارزمية تحسين عامل النسخ باستخدام سجل تعيينات الحافة ودرجة القمة المتزايدة. باستخدام وظيفة تأخذ في الاعتبار هذين العاملين، قم بحساب أفضل قسم لتعيين الحافة التي تم تحليلها. تعتمد النسخة المتماثلة التي تم إنشاؤها على درجة القمم، ومن المحتمل أن تكون القمم التي تم نسخها متماثلة ما يسمى "العقدة المحورية"، وهي القمم ذات الدرجة الأعلى.
تعد خوارزمية Vertex-cut (EBV) الفعالة والمتوازنة بمثابة خوارزمية قطع قمة غير متصلة بالإنترنت كما هو موضح في هذه الورقة. تحاول هذه الخوارزمية موازنة الأقسام فيما يتعلق بعدد حواف ورؤوس كل قسم وعامل النسخ. يتم تطبيق صيغة لتقييم القسم الذي يتم فيه تعيين الحافة التي تأخذ في الاعتبار أيضًا العدد الإجمالي لحواف ورؤوس الرسم البياني. صيغة التقييم هي التالية:
يتم أخذ القيمة الأدنى كمعرف القسم.
مصفوفة الدرجات عبارة عن مصفوفة مربعة توفر نظرة ثاقبة حول اتصال العقد في الرسم البياني. بالنسبة للرسوم البيانية الموجهة، فإنه يعكس عدد الحواف الواردة والصادرة لكل عقدة، بينما بالنسبة للرسوم البيانية غير الموجهة، فإنه يمثل عدد الحواف الواردة لكل عقدة.
مصفوفة لابلاس هي مصفوفة مربعة مشتقة من مصفوفة المجاورة ومصفوفة الدرجة للرسم البياني. وهو مفيد في تحليل الخصائص المختلفة للرسم البياني، مثل الترابط، وعدد الأشجار الممتدة، والخصائص الطيفية الأخرى.
تُستخدم المصفوفة الانتقالية بشكل شائع في دراسة سلاسل ماركوف والعمليات العشوائية. وفي سياق الرسم البياني، فإنه يشير إلى احتمالات الانتقال من عقدة إلى أخرى، وغالبًا ما يعتمد ذلك على أوزان الحواف أو معايير محددة مسبقًا. تجد هذه المصفوفة تطبيقات في مجالات مختلفة مثل تحليل الشبكات والتعلم الآلي والتحسين.
إذا كنت ترغب في تقديم الدعم الخاص بك، يمكنك إنشاء طلب سحب أو الإبلاغ عن مشكلة . إذا كنت تريد تغيير الكود، أو إصلاح مشكلة، أو تنفيذ ميزة جديدة، فيرجى قراءة دليل المساهمة الخاص بنا.
إذا كنت ترغب في مناقشة الميزات الجديدة أو كان لديك أي أسئلة أو اقتراحات حول المكتبة، يرجى فتح مناقشة أو ببساطة الدردشة
موقع سي اكس اكس جراف
البريد الإلكتروني: [email protected]
الملف الشخصي على جيثب
لدعمي أضف نجمة للمشروع أو تابعني
لتبقى على اطلاع، شاهد المشروع
تمت الإشارة إليه بواسطة:
شكرًا لمجتمع TheAlgorithms على بعض إلهام الخوارزميات.
بفضل GeeksForGeeks لبعض الإلهام الخوارزمية.
شكرًا لجميع الأشخاص الذين ساهموا بالفعل في CXXGraph!
إذا كنت تستخدم هذا البرنامج، فيرجى اتباع تعليمات CITATION. شكرًا لك!
لقد شاركنا في Hacktoberfest 2021. شكرًا لجميع المساهمين!
لقد شاركنا في Hacktoberfest 2022. شكرًا لجميع المساهمين!
لقد شاركنا في Hacktoberfest 2023. شكرًا لجميع المساهمين!
عرض القيمة التقديرية للمشروع
@زيج رازور |
---|