الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تصحيح اكواد ال minimum spanning tree

بدأه Ro07 في 7 مايو 2012 · 6 رد · 2,740 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركااته

ياجماعه انا مبتديئه في البرمجه و عندي مشرووع عن ال minimum spanning tree وماعندي ادنى فكره عنها

بحثت كثير وحاولت افهم ومبدئياً كتبت الأكواد

لكن مااعرف اذا انا فهمت الفكره صح أو لا

وكمان الأكواد ماتشتغل عندي فيها اخطاء مو عارفه اصححها

اتمنى مساعدتكم

الترجمه من قوقل

الحد الأدنى شجرة الامتداد

وصف

نظرا G الرسم البياني الذي هو مرجح، متصلة، الرسم البياني غير موجهة، وتي شجرة تمتد هو subgraph

من G التي هي: (1) شجرة (2) يربط جميع القمم من G معا. ثقل الممتدة

شجرة هو مجموع أوزان حواف في تلك الشجرة. الشجرة التي تغطي الحد الأدنى هي التي تغطي

شجرة: (3) الذين يكون وزنهم أقل من أو مساو لوزن كل شجرة أخرى تمتد.

كتابة برنامج الذي يحدد ما إذا كان T شجرة معينة هي شجرة الامتداد الحد الأدنى للحصول على الرسم البياني نظرا G.

نسق إدخال

وسيتم اختبار البرنامج على حالات الاختبار واحد أو أكثر. سيكون لكل حالة اختبار أن تحصل على رسم بياني

G واحد أو أكثر من الأشجار لاختبار. والسطر الأول من حالة اختبار لديها واحدة ايجابية عدد صحيح ن

تدل على عدد من القمم في G (حيث 1 <ن ≤ 1000). يتم ترقيم القمم انطلاق

من 1. التالي (N-1) تحديد خطوط مثلث العلوي من مصفوفة الجوار على الرسم البياني كما ترى

هنا:

W1، 2 W1، 3. . . W1، N-1 W1، ن

W2، 3 W2، 4. . . W2، ن

...

WN-1، ن

حيث واي، ي هو وزن الحافة بين القمم وأنا ي. واي، ي = 0 المنتدى ليس هناك حافة بين

i و j. لاحظ أن 0 ≤ واي، ي ≤ 1000

بعد تحديد الرسم البياني، وحالة اختبار تحديد عدد واحد س إيجابي على منفصلة

خط حيث 0 <س ≤ 1000. سؤال يدل على عدد من الأشجار لاختبار على الرسم البياني معين.

كل شجرة ويتكون إما من قمة واحدة، نظرا لعدد منها، أو تم تعيينه على النحو التالي:

(R T1 T2 ... TC)

حيث R هو رقم من قمة الرأس في جذر وT1،. . . ، والتعاون التقني (حيث 0 <ج ≤ 1000) هي

شبه أشجار R المحدد بشكل متكرر.

والسطر الأخير من ملف الإدخال لديها صفر واحد.

تنسيق الإخراج

كل استعلام، وكتابة النتيجة على سطر منفصل باستخدام الشكل التالي:

a.b._result

حيث هو رقم حالة اختبار (بدءا من 1،) و (ب) هو رقم الاستعلام في هذه الحالة اختبار

(بدءا من جديد في 1). النتيجة هي إما "نعم" أو "لا" مشيرا الى شجرة وإذا هو الحد الأدنى الذي يمتد

شجرة أم لا

صوره للمشروع بالمدخلات والمخرجات

post-261409-080197800 1336411043_thumb.p

محاولتي في الحل

#include <iostream>
using name space std;
#define ROW 7
#define COL 7
#define infi1000  //infi for infinityclass prims
{
   int graph[ROW][COL],nodes;
   public:
   prims();
   void createGraph();
   void primsAlgo();
};

{
     for(int i=0;i<ROW;i++)
       for(int j=0;j<COL;j++)
     graph[j]=0;
}

 createGraph(){
    int i,j;
    cout<<"Enter Total Nodes : ";
    cin>>nodes;
    cout<<"\n\nEnter Adjacency Matrix : \n";
    for(i=0;i<nodes;i++)
        for(j=0;j<nodes;j++)
        cin>>graph[j];

    //Assign infinity to all graph[j] where weight is 0.for(i=0;i<nodes;i++){
        for(j=0;j<nodes;j++){
           if(graph[j]==0)
          graph[j]=infi;
        }
    }
}

 primsAlgo(){
    int selected[ROW],i,j,ne; //ne for no. of edgesintfalse=0,true=1,min,x,y;

    for(i=0;i<nodes;i++)
       selected=false;

    selected[0]=true;
    ne=0;

    while(ne < nodes-1){
       min=infi;

       for(i=0;i<nodes;i++)
       {
          if(selected==true){
         for(j=0;j<nodes;j++){
            if(selected[j]==false){
               if(min > graph[j])
               {
               min=graph[j];
               x=i;
               y=j;
               }
            }
         }
          }
       }
       selected[y]=true;
       cout<<"\n"<<x+1<<" --> "<<y+1;
       ne=ne+1;
    }
}

void main(){
    prims MST;
    clrscr();
    cout<<"\nPrims Algorithm to find Minimum Spanning Tree\n";
    MST.createGraph();
    MST.primsAlgo();
    getch();
}
المرفقات
1234.PNG

تم تعديل هذه المشاركة بواسطة Ro07 في 7 مايو 2012 في 20:43

#2

السلام عليكم ...

  1. الكود الموجود في مشاركتكم موجود هنا..
  2. هذه هي الـــ http://en.wikipedia....m%27s_algorithm خوارمية الــ prims . , و هي موجودة بكل لغات البرمجة تقريبا ...
  3. إذا كنتم تريدون تعديله كي لا يكون class فهذا هو الكود :
    #include <iostream>
    //#include <conio.h>
    using namespace std;
    #define ROW 7
    #define COL 7
    #define infi 5000  //infi for infinity
    
    
       int graph[ROW][COL],nodes;
       void prims();
       void createGraph();
       void primsAlgo();
    
    
    void prims(){
        	for(int i=0;i<ROW;i++)
        	for(int j=0;j<COL;j++)
         	graph[j]=0;
    }
    
    void  createGraph(){
        	int i,j;
        	cout<<"Enter Total Nodes : ";
        	cin>>nodes;
        	cout<<"\n\nEnter Adjacency Matrix : \n";
        	for(i=0;i<nodes;i++)
                	for(j=0;j<nodes;j++)
    				{
    					cout<<"graph["<<i<<"][" <<j << "]=" ;
    					cin>>graph[j];
    				}
    
        	//Assign infinity to all graph[j] where weight is 0.
        	for(i=0;i<nodes;i++){
                	for(j=0;j<nodes;j++){
                	if(graph[j]==0)
                  	graph[j]=infi;
                	}
        	}
    }
    
    void   primsAlgo(){
        	int selected[ROW],i,j,ne; //ne for no. of edges
        	int ffalse=0,ttrue=1,min,x,y;
    
        	for(i=0;i<nodes;i++)
           	selected=ffalse;
    
        	selected[0]=ttrue;
        	ne=0;
    
        	while(ne < nodes-1){
           	min=infi;
    
           	for(i=0;i<nodes;i++)
           	{
                	if(selected==ttrue){
                 	for(j=0;j<nodes;j++){
                        	if(selected[j]==ffalse){
                        	if(min > graph[j])
                        	{
                           	min=graph[j];
                           	x=i;
                           	y=j;
                        	}
                        	}
                 	}
                	}
           	}
           	selected[y]=ttrue;
           	cout<<"\n"<<x+1<<" --> "<<y+1;
           	ne=ne+1;
        	}
    }
    
    int main(){
        	prims();
        	//clrscr();
        	cout<<"\nPrims Algorithm to find Minimum Spanning Tree\n";
        	createGraph();
        	primsAlgo();
        	//getch();
        	int i;
        	cin>> i ;
        	return 0;
    }

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 11 مايو 2012 في 02:43

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

مشكور اخ حسن ع الرد

لكن ممكن تشرح لي الفكره لـ افهمها اكثر

#4

السلام عليكم ...

لا شكر على واجب ...

أنا حسام (لست حسن) ...

  1. يوجد الكثير من الشروحات و الفيديوهات لخوارزمية الــ Prim ..رابط البحث يوتيوب
  2. انصحكم بمشاهدة هذا
    لأنه بلكنة (لهجة) واضحة .. و يوضح كيف قمنا بإنشاء الغراف على شكل مصفوفة ثم كيف أوجدنا الــ minimum spanning tree اختصارا MST .
  3. الغراف : مجموعة من العقد vertex و الوصلات بين هذه العقد arcs أو تسمى edges حواف و على كل قوس arc يوجد وزن ما weight .
  4. الــ spanning tree هي مجموعة الأقواس التي تصل كل العقد بعضها ببعض دون تشكيل حلقة loop... كما هو واضح في الرسمة التي ارسلتموها ..
  5. يوجد أكثر من spanning tree للغراف الواحد ..
  6. كل الــ spanning trees يحوي nodes -1 قوس أكيد (لأنه يصل كل العقد دون حلقة) انظروا للكود ( while(ne < nodes-1)).
  7. الــ Minimum spanning tree هي الشجرة التي مجموع الأوزان فيها هو الأصغر بين كل الــ spanning trees الموجودة في الغراف الذي نعمل عليه .
  8. أولا الغراف هو مصفوفة مربعة فيها العقد في الأسطر و الأعمدة و الأوزران هي قيم المصفوفة .. طبعا المصفوفة متناظرة بالنسبة للقطر لأن الوزن من العقدة a إلى c مثلا هو نفس الوزن من c إلى a ..
  9. نحتاج لمصفوفة أخرى اسمها selected (طولها بعدد العقد) لنعرف هل تم اختيار السطر رقم i (أي هل العقدة رقم i صارت في الشجرة ) أم لا .. أي لو كان selected[2] = true هذا يعني أن العقدة رقم 2 صارت ضمن الــ MST
  10. نختار عقدة ما .. هو اختار أول عقدة (selected[0]=ttrue;) و نضيفها للشجرة ..
  11. نبحث في عمود هذه العقدة المحددة if(selected==ttrue) عن عقدة غير محددة if(selected[j]==ffalse) و لها أصغر وزن في العمود.. و نحدد سطرها .. و ننقل إلى عمودها
  12. نكرر العملية بإيجاد أصغر قيمة غير محددة في العمود الجديد و هكذا ..... حتى نجد الشجرة كلها ..

اتمنى أن لا اكون أخطات في الشرح ....

3

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#5

عذراً اخ حساام لم انتبه

...

وجزاااك الله كل خيير

شرح واافــي وكـافــي استفدت منه كثيراً

هل من الممكن ان تضع لي صووره لتشغيل البرنامج ان امكنك ذلك ( out put )

وشكراً جزيلاً

تم تعديل هذه المشاركة بواسطة Ro07 في 10 مايو 2012 في 20:14

#6

السلام عليكم ..

بارك الله بكم ..

  1. قمت بتعديل الكود في المشاركة السابقة كي يطبع رقم السطر و العمود في المصفوفة , حتى نعرف العنصر الذي ندخله ..
  2. سأقوم بإدخال المصفوفة المذكورة برابط الفيديو , و موجود بالصورة ..
  3. إذا لم يكن هناك قوس اتصال بين عقدنين سأدخل قيمة كبيرة , مثل 1000 ..
  4. المثال على العقد A , B , C , D , E و ناتج الخوارمية هو 1 و 2 و 3و 4 و 5 حيث a=1 و b=2 و c=3 و d=4 وe = 5 ..
  5. لاحظ أنه عند إدخال المصفوفة بدأنا بالعنصر (0,0) .. يعني هو فقط عند طباعة النتائج يقول لك من العقدة الأولى إلى الثالثة و من الثالثة إلى .. كذا .. راجعوا الكود ..

post-94677-057298400 1336693752_thumb.pn

المرفقات
prim.png
2

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#7

الف شكر لك

في موازيين حسنااتك يااارب

مواضيع مشابهة