إيجاد أطول مسار في رسم بياني باستخدام STL والترتيب الطوبولوجي

C++ Hard STL

مهمة «إيجاد أطول مسار في رسم بياني باستخدام STL والترتيب الطوبولوجي»

لدينا رسم بياني موجه غير دوري (DAG) يحتوي على N رأس و M حافة. كل حافة لها وزن صحيح (يمكن أن يكون سالبًا). يجب إيجاد طول أطول مسار من رأس بداية معين S إلى جميع الرؤوس الأخرى. إذا كان الرأس غير قابل للوصول، أخرج "INF". استخدم الترتيب الطوبولوجي (خوارزمية كان) والبرمجة الديناميكية. القيود: N ≤ 10^5, M ≤ 2*10^5, الأوزان معامل ≤ 10^9. مضمون أن الرسم البياني لا يحتوي على دورات.

تنسيق الإدخال

السطر الأول: N M S (1 ≤ N ≤ 100000, 0 ≤ M ≤ 200000, 1 ≤ S ≤ N). الأسطر M التالية: u v w (1 ≤ u, v ≤ N, -10^9 ≤ w ≤ 10^9).

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

قم بإخراج N سطر: لكل رأس i (من 1 إلى N)، أخرج طول أطول مسار من S إلى i، أو "INF" إذا كان الرأس غير قابل للوصول. يُعتبر طول المسار من S إلى S مساويًا لـ 0.

أمثلة

مثال 1

الإدخال
4 3 1 1 2 5 1 3 3 2 4 2
الإخراج
0 5 3 7

مثال 2

الإدخال
3 2 1 1 2 -1 2 3 -2
الإخراج
0 -1 -3
main.cpp