การอนุญาตให้มีน้ำหนักเท่ากับศูนย์ในกราฟน้ำหนักหรือไม่


60

ฉันกำลังพยายามเขียนสคริปต์ที่สร้างกราฟแบบสุ่มและฉันจำเป็นต้องทราบว่าขอบในกราฟถ่วงน้ำหนักสามารถมีค่า 0 หรือไม่

จริงๆแล้วมันสมเหตุสมผลที่ 0 สามารถใช้เป็นน้ำหนักของขอบ แต่ฉันได้ทำงานกับกราฟในไม่กี่วันที่ผ่านมาและฉันไม่เคยเห็นตัวอย่างของมันมาก่อน

ป้อนคำอธิบายรูปภาพที่นี่


28
หากค่าลบเป็น "อนุญาต" แล้วทำไมไม่เป็นศูนย์ :)
ดีเร็ก朕會功夫

5
ตัวอย่างเช่นหากน้ำหนักเชิงบวกแสดงถึงปริมาณการใช้เชื้อเพลิงสุทธิเมื่อเดินทางจากโหนหนึ่งไปยังอีกจุดหนึ่งตุ้มน้ำหนักเชิงลบอาจหมายถึงการเติมน้ำมันสุทธิ ขอบที่มีน้ำหนักเป็นศูนย์คือที่ที่เชื้อเพลิงที่ใช้ไปนั้นถูกชดเชยโดยการเติมเชื้อเพลิง
JW

1
@DavidRicherby ฉันเชื่อว่าคำถามจริงนี่คือเช่น "เป็นอัลกอริทึม X ถูกต้องในที่ที่มีน้ำหนักเป็นศูนย์ขอบ" มิฉะนั้นบริบทคืออะไร? คำตอบอาจเป็นใช่หรือไม่ใช่ก็ได้ขึ้นอยู่กับรายละเอียด คำถามเช่น "อาร์เรย์มีค่าเป็นศูนย์หรือไม่" มีความหมาย
Juho

1
@Juho: โอ้ชัดเจนแล้ว มันเหมือนกับถามว่าตัวเลขสามารถลบได้หรือไม่ สำหรับคุณดูเหมือนจะชัดเจนว่ามันขึ้นอยู่กับบริบท แต่ก็ไม่แน่ใจว่าจะเห็นได้ชัดสำหรับคนจนกว่าตัวเลขลบมาพร้อม แม้กระทั่งศูนย์ก็ไม่ชัดเจน
Mehrdad

1
น้ำหนักของคุณอาจไม่ได้เป็นจำนวนจริงทั้งนี้ขึ้นอยู่กับสิ่งที่คุณต้องการทำ ตัวอย่างเช่นหากกราฟของคุณแทนวงจร AC น้ำหนักของคุณอาจเป็นเฟสเซอร์และเป็นตัวเลขที่ซับซ้อน
user2357112

คำตอบ:


165

ได้รับอนุญาตโดยใคร ? ไม่มีการจัดการกราฟกลางที่ตัดสินใจว่าคุณสามารถทำได้และทำอะไรไม่ได้ คุณสามารถกำหนดวัตถุในวิธีที่สะดวกสำหรับคุณตราบใดที่คุณชัดเจนเกี่ยวกับความหมายคืออะไร หากขอบที่มีน้ำหนักศูนย์เป็นประโยชน์กับคุณให้ใช้ขอบนั้น เพียงให้แน่ใจว่าผู้อ่านของคุณรู้ว่าสิ่งที่คุณกำลังทำ

เหตุผลที่คุณมักจะไม่เห็นขอบที่มีน้ำหนักเป็นศูนย์นั้นในบริบทส่วนใหญ่ขอบที่มีศูนย์น้ำหนักนั้นเทียบเท่ากับการไม่มีขอบ ตัวอย่างเช่นหากกราฟของคุณเป็นตัวแทนของประเทศและจำนวนการค้าที่ทำระหว่างพวกเขาขอบไร้ศูนย์จะหมายถึงไม่มีการค้าใด ๆ ซึ่งเหมือนกับการไม่มีขอบเลย หากกราฟของคุณแทนระยะทางขอบ zero-weight จะตรงกับสองตำแหน่งที่ระยะห่างศูนย์จากกันและกันซึ่งหมายความว่าพวกมันอยู่ในตำแหน่งเดียวกันดังนั้นทั้งคู่จึงควรแสดงจุดยอดเดียวกัน อย่างไรก็ตามในบริบทอื่น ๆ ขอบ zero-weight อาจเข้าท่า ตัวอย่างเช่นหากกราฟของคุณแสดงถึงเครือข่ายถนนและน้ำหนักที่ขอบแสดงปริมาณการเข้าชมมีความแตกต่างอย่างมากระหว่างถนนที่ไม่มีใครใช้ (ขอบที่มีน้ำหนักเป็นศูนย์) และถนนที่ไม่มีเลย (ไม่มีขอบ)


1
เป็นที่น่าสังเกตว่าอัลกอริทึมกราฟจำนวนมากระบุอย่างชัดเจนว่าพวกมันทำงานบนกราฟที่มีน้ำหนักเชิงลบหรือไม่ ฉันคิดว่านี่ชัดเจนว่าแม้อนุญาตให้น้ำหนักเชิงลบได้ขึ้นอยู่กับบริบท
Mooing Duck

6
@MooingDuck ฉันคิดว่าประเด็นของคำถามคือว่าในขณะที่อัลกอริทึมมักจะพูดว่าพวกเขาทำงานเพื่อน้ำหนักเชิงลบหรือเปล่า น้ำหนักเชิงลบนั้นผิดปกติน้อยกว่าศูนย์ดังนั้นในบริบทนี้ฉันไม่แน่ใจว่าต้องพูดถึง
David Richerby

13

มันขึ้นอยู่กับบริบท โดยทั่วไปใช่ขอบของศูนย์และน้ำหนักเชิงลบอาจได้รับอนุญาต ในบางกรณีน้ำหนักขอบอาจต้องไม่เป็นลบหรือเป็นบวกอย่างเคร่งครัด (ตัวอย่างเช่นอัลกอริทึมของ Dijkstra ต้องการให้น้ำหนักไม่เป็นลบ)


มีกราฟชนิดใดบ้างที่ห้ามไม่ให้มีศูนย์? และช่วยให้ค่าลบหรือบวก?
Taxellool

9
"กราฟถ่วงน้ำหนักขอบไม่เป็นศูนย์"
Tom van der Zanden

10
@Taxellool ไม่ได้ตั้งวัตถุทางคณิตศาสตร์เป็นหิน ไม่มีรายการคงที่ของวัตถุทางคณิตศาสตร์ที่มีชื่อคงที่ที่เป็นคนเดียวที่คุณได้รับอนุญาตให้ใช้
David Richerby

ขึ้นอยู่กับอัลกอริทึมที่คุณใช้ Bellman-Ford ยอมรับค่าศูนย์ในขณะที่ Dijkstra พวกเขาจะ obviated
Manuel Azar

5

เช่นเดียวกับคำตอบอื่น ๆ คุณมีอิสระที่จะพิจารณา (หรือแยกออกจากการพิจารณา) กราฟถ่วงน้ำหนักที่มีขอบเป็นศูนย์

ตามที่กล่าวไว้ในประสบการณ์ของฉันการประชุมตามปกติในการใช้งานกราฟน้ำหนักส่วนใหญ่คือการทำให้ไม่มีความแตกต่างระหว่างขอบที่มีน้ำหนักเป็นศูนย์และการไม่มีขอบ หนึ่งในเหตุผลนี้ก็คือว่าโดยทั่วไปแล้วกราฟถ่วงน้ำหนักแสดงเป็นภาพรวมของmultigraphsซึ่งจะเป็นภาพรวมของกราฟที่เรียบง่าย

โดยเฉพาะการเขียนด้วยลายมือเป็นกราฟที่ (ซึ่งแตกต่างจากกราฟอย่างง่าย ) ช่วยให้ขอบหลายจุดระหว่างโหนดคู่เดียวกัน ในขณะที่ในกราฟอย่างง่ายคู่ของโหนดใด ๆ ที่เชื่อมต่อเสมอโดย 0 หรือ 1 ขอบคู่ของโหนดในการเขียนแบบหลายอาจเชื่อมต่อโดย 0, 1, 2, 3 หรือมากกว่า (แต่มักจะเป็นจำนวนเต็มไม่ลบ ) ขอบ

การวางกราฟมัลติจิ้งเพื่อให้ได้จำนวนเศษส่วนระหว่างขอบของโหนดจากนั้นนำไปสู่การพิจารณากราฟถ่วงน้ำหนักและอัลกอริธึมหลายอย่างที่ทำงานกับกราฟมัลติกราฟแบบสุ่มสามารถทำงานบนกราฟถ่วงน้ำหนักเช่นนั้นได้ แต่สำหรับขั้นตอนวิธีการดังกล่าว "น้ำหนัก" ของขอบจริงๆหมายถึงมันหลายหลาก ดังนั้นเมื่อตีความอย่างนี้แล้วจะไม่มีความแตกต่างที่มีความหมายระหว่าง "no edge" และ "0 edge" ระหว่างคู่ของโหนด: ทั้งคู่หมายถึงสิ่งเดียวกัน

แน่นอน "กราฟถ่วงน้ำหนัก" ตามคำจำกัดความเป็นเพียงกราฟที่มีจำนวนที่เกี่ยวข้องกับแต่ละขอบและเป็นไปได้อย่างสมบูรณ์ในการตีความน้ำหนักเป็นอย่างอื่นนอกเหนือจากหลายหลากซึ่งในกรณีนี้ความแตกต่างระหว่างไม่มีขอบและศูนย์น้ำหนัก ขอบอาจมีความหมาย แต่การพยายามใช้อัลกอริธึมการเขียนด้วยลายมือแบบมาตรฐานกับ "กราฟถ่วงน้ำหนักที่แปลกประหลาด" นั้นไม่น่าจะให้ผลลัพธ์ที่จะสมเหตุสมผลในแง่ของการตีความทางเลือก (ไม่ใช่หลายหลาก) ของน้ำหนักขอบ


6
กราฟที่มีน้ำหนักแสดงว่า "โดยทั่วไป" ขึ้นอยู่กับเขตข้อมูลของคุณเป็นอย่างมาก เมื่อฉันสร้างแบบจำลองเครือข่ายถนนเป็นกราฟเพื่อหาเส้นทางที่สั้นที่สุดน้ำหนักจะแสดงระยะทางฉันไม่ได้เริ่มต้นด้วยถนนหลายเส้นระหว่างทางแยกจากนั้นแนะนำถนนที่เป็นเศษส่วน
adrianN

3
@adrianN แม้ว่าในกราฟเช่นว่าการไม่มีขอบสอดคล้องกับค่าที่เกี่ยวข้องไม่สิ้นสุดและไม่เป็นศูนย์
CodesInChaos

0

ลองนึกถึงกราฟของระบบถนนในเคมบริดจ์สหราชอาณาจักรบันทึกร่วมกันระหว่างนักปั่นจักรยานและคนขับรถดังนั้นส่วนใหญ่จึงเป็นขอบ การทำเช่นนี้ลดค่าใช้จ่ายในการบำรุงรักษาข้อมูลลงอย่างมาก

ตอนนี้ถ้าเรากำหนดน้ำหนักขอบเป็นเวลาเดินทางในไม่กี่วินาทีขอบแต่ละข้างจะมีน้ำหนักสองน้ำหนักหนึ่งคันสำหรับรถยนต์อับเรนจ์สำหรับจักรยาน น้ำหนักบางอย่างจะไม่มีที่สิ้นสุดเนื่องจากรถยนต์ไม่ได้รับอนุญาตให้ใช้เส้นทางจักรยาน

ทีนี้ลองพิจารณาทางแยกสองแห่งที่อยู่ใกล้กันมากดังนั้นพวกเขาจะได้รับการเชื่อมต่อด้วยเสาสองสามเสาที่หยุดคนขับรถ (ตัวอย่างเช่นทางแยกที่ซึ่งรถยนต์ขับรถสามารถเลี้ยวซ้ายได้เท่านั้น แต่นักปั่นจักรยานสามารถไปในทิศทางใดก็ได้) จากนั้นเราจะได้น้ำหนักที่ไม่มีขีด จำกัด จากนักขับรถและ 0 น้ำหนักสำหรับนักปั่น

(เห็นได้ชัดว่าสามารถประมวลผลกราฟล่วงหน้าเพื่อสร้างกราฟที่ง่ายขึ้นสำหรับการกำหนดเส้นทางของนักปั่นจักรยานก่อนที่จะกำจัดเส้นทางที่ดีที่สุด)


ฉันไม่เห็นว่าสิ่งนี้ตอบคำถามได้อย่างไร คำถามถามเกี่ยวกับขอบที่มีศูนย์น้ำหนัก ในตัวอย่างของคุณ (ซึ่งอาจไม่สมเหตุสมผลสำหรับคนที่ไม่คุ้นเคยกับเคมบริดจ์) ซึ่งแต่ละด้านมีน้ำหนักสองน้ำหนักอยู่แล้ว ตอนนี้ตราบเท่าที่คุณสามารถกำหนดกราฟถ่วงน้ำหนักตามที่คุณต้องการได้ แต่ก็ไม่ได้ตอบคำถามที่ถาม นอกจากนี้ขอบที่คุณอธิบายทั้งหมดดูเหมือนจะมีน้ำหนักน้อยมากสำหรับนักปั่นจักรยาน: แม้แต่การเคลื่อนที่ในระยะทางสั้น ๆ ก็ต้องใช้ระยะเวลาที่ไม่เป็นศูนย์
David Richerby

@DavidRicherby เพียงแค่สมมติว่าเวลาน้อยกว่า 1 วินาทีจะไม่ถูกบันทึก
Ian Ringrose

0

ดูเหมือนว่าคุณกำลังใช้น้ำหนักเพื่อลองและแสดงสองแง่มุมที่แตกต่างกันอย่างชัดเจนของกราฟ ที่แรกก็คือว่ากราฟมีขอบ (วาด) จริง ๆ และที่สองคือน้ำหนักจริง

ดังที่คุณสังเกตเห็นว่าคุณตกอยู่ในสถานการณ์ที่สับสนถ้าคุณใช้ 'ไม่เป็นศูนย์' เป็นตัวบ่งชี้ว่ามีขอบ (และจะต้องถูกดึงออกมาหรือมีรายชื่ออยู่) ในขณะเดียวกันก็พบสถานการณ์ โดยที่ศูนย์น้ำหนักถูกจัดประเภทว่าถูกต้อง

โดยพื้นฐานแล้วคุณจะต้องมีอีกวิธีหนึ่งในการแสดงถึงขอบ (สมมติว่าคุณต้องการจริง ๆ และไม่สามารถสร้างน้ำหนัก N ^ 2 ได้ แต่จากนั้นคุณตกหลุมพรางของการตัดสินใจว่าจะทำอย่างไรกับลูป ขอบด้านหลัง ... )


ฉันไม่แน่ใจว่านี่เป็นคำตอบที่แท้จริง คำถามเกี่ยวกับว่ากราฟอาจมีขอบเป็นศูนย์น้ำหนักหรือไม่ คำตอบของคุณส่วนใหญ่เกี่ยวกับวิธีการใช้โครงสร้างข้อมูลสำหรับกราฟที่มีขอบเป็นศูนย์
David Richerby

@DavidRicherby, ปิด; มัน (คำตอบของฉัน) เป็นข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุและคำถามที่เกิดขึ้น บ่อยครั้งที่สามารถหาเหตุผลเข้าข้างตนเองเกี่ยวกับสาเหตุของปัญหาในตอนแรกสามารถช่วยได้อย่างมากในการดูว่าวิธีการแก้ปัญหาคือคำตอบที่ถูกต้องและไม่ใช่แค่ 'เหลวไหล'
Philip Oakley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.