מציאת השביל הקצר ביותר בגרף

cpdebugger

New member
מציאת השביל הקצר ביותר בגרף

הבעייה: נתון גרף עם משקלים V – vertices E-Edges כל צמת מחוברת בקשת ל-1 – V צמתים (בהכרח קיים מסלול בין כל צמת לצמת). שלב א: אני מעוניין למצוא לכל צמת את הצמת הכי רחוקה ממנה בגרף. כלומר לכל צמת v למצוא את כל המרחקים הקצרים ביותר בינה ובין שאר הצמתים בגרף, ומבין כל המרחקים הללו לברור את הארוך ביותר. שלב ב: למיין לפי אורך את המרחקים הקצרים הארוכים שמצאתי בשלב א. חשבתי על אלגו floyd – Warshall למציאת מסלול קצר בין כל ה vertices כי הוא רץ בסיבוכיות של V בשלישית. שאלה 1: אולי מישהו יכול לחשוב על אלגו אחר, כי למעשה אני לא זקוק לכל המרחקים הכי קצרים בין כל זוג צמתים (יש כאלו V בריבוע), רק לכל צומת את המסלול הארוך ביותר ממנה לצמת אחרת (יש כאלו V). שלב ג': תוך כדי ריצה של האפליקציה נמחקים צמתים בגרף אבל עדיין מתקיים התנאי שבהכרח קיים מסלול בין כל צמת לצמת אחרת. אני צריך למצוא שוב לכל צמת את הצמת הכי רחוקה ממנה בגרף ולמיין את המרחקים. האפשרות הפשוטה היא להריץ את האלגוריתם של שלבים א' ו ב' מחדש. שאלה 2: האם יש דרך לייעל את ג'. להחזיק מבני נתונים שיאפשרו פתרון מבלי לחשב מחדש את כל המרחקים בגרף?
 

vinney

Well-known member
הגרף עם משקלים, נכון?

פלויד וורשל משתמש במשקלים (למעשה הגרף הקצר ביותר שהוא מוצא זה הגרף ה"זול" ביותר שהוא מוצא, זה הקצר ביותר במידה וכל המשקלים הם 1). כדי שהוא יעבוד, תהפוך את המשקלים (אחד חלקי) עבור האלגוריתם, וכך המסלול הקצר ביותר שהוא ימצא יהיה בעצם הארוך ביותר בגרף שאתה מחפש. שים לב שהמרחקים חייבים להיות חיוביים. מיון - לא הבנתי מה הבעיה פה... לגבי 2 - אם שואלים את זה - כנראה שיש, אחרת תצטרך להוכיח שאין
.
 

cpdebugger

New member
כן, גרף עם משקלים

אני לא מחפש את המסלול הארוך ביותר אלא את המסלול הארוך ביותר מבין המסלולים הקצרים ביותר. כלומר, לכל צמת אני מחפש מבין המסלולים האופטימליים ממנו לכל הצמתים האחרים ומבין המסלולים (הקצרים), שמצאתי אני צריך למצוא את הארוך ביותר. לבסוף אני צריך למצוא מבין התוצאות שמצאתי לכל הצמתים, את הקצר ביותר (ולכן המיון). אין לי בעייה במיון, אני אפילו לא טורח לממש אותו בעצמי אלא דוחף את התוצאה לוקטור ומשתמש ב std::sort הזכרתי את המיון רק כחלק מהתהליך. פלויד וורשל פותר לי את האלגוריתם אלא שאני מחפש לעשות לו אופטימיזציה. אני איני זקוק לדעת את את כל המרחקים הקצרים בין שני צמתים, N בריבוע כאלו- אלא לגבי כל צומת Vi, מי היא הצומת Vi+1 הרחוקה ממנה ביותר.
 

vinney

Well-known member
הא, נו, עוד יותר פשוט

לא צריך להפוך משקלים אפילו, מה שכתבת זה מה שיעשה לך את העבודה. לא הבנתי את השורה האחרונה. אתה יכול להביא את השאלה איך שהיא מנוסחת?
 
למעלה