ฉันกำลังพยายามเขียนสคริปต์ที่สร้างกราฟแบบสุ่มและฉันจำเป็นต้องทราบว่าขอบในกราฟถ่วงน้ำหนักสามารถมีค่า 0 หรือไม่
จริงๆแล้วมันสมเหตุสมผลที่ 0 สามารถใช้เป็นน้ำหนักของขอบ แต่ฉันได้ทำงานกับกราฟในไม่กี่วันที่ผ่านมาและฉันไม่เคยเห็นตัวอย่างของมันมาก่อน
ฉันกำลังพยายามเขียนสคริปต์ที่สร้างกราฟแบบสุ่มและฉันจำเป็นต้องทราบว่าขอบในกราฟถ่วงน้ำหนักสามารถมีค่า 0 หรือไม่
จริงๆแล้วมันสมเหตุสมผลที่ 0 สามารถใช้เป็นน้ำหนักของขอบ แต่ฉันได้ทำงานกับกราฟในไม่กี่วันที่ผ่านมาและฉันไม่เคยเห็นตัวอย่างของมันมาก่อน
คำตอบ:
ได้รับอนุญาตโดยใคร ? ไม่มีการจัดการกราฟกลางที่ตัดสินใจว่าคุณสามารถทำได้และทำอะไรไม่ได้ คุณสามารถกำหนดวัตถุในวิธีที่สะดวกสำหรับคุณตราบใดที่คุณชัดเจนเกี่ยวกับความหมายคืออะไร หากขอบที่มีน้ำหนักศูนย์เป็นประโยชน์กับคุณให้ใช้ขอบนั้น เพียงให้แน่ใจว่าผู้อ่านของคุณรู้ว่าสิ่งที่คุณกำลังทำ
เหตุผลที่คุณมักจะไม่เห็นขอบที่มีน้ำหนักเป็นศูนย์นั้นในบริบทส่วนใหญ่ขอบที่มีศูนย์น้ำหนักนั้นเทียบเท่ากับการไม่มีขอบ ตัวอย่างเช่นหากกราฟของคุณเป็นตัวแทนของประเทศและจำนวนการค้าที่ทำระหว่างพวกเขาขอบไร้ศูนย์จะหมายถึงไม่มีการค้าใด ๆ ซึ่งเหมือนกับการไม่มีขอบเลย หากกราฟของคุณแทนระยะทางขอบ zero-weight จะตรงกับสองตำแหน่งที่ระยะห่างศูนย์จากกันและกันซึ่งหมายความว่าพวกมันอยู่ในตำแหน่งเดียวกันดังนั้นทั้งคู่จึงควรแสดงจุดยอดเดียวกัน อย่างไรก็ตามในบริบทอื่น ๆ ขอบ zero-weight อาจเข้าท่า ตัวอย่างเช่นหากกราฟของคุณแสดงถึงเครือข่ายถนนและน้ำหนักที่ขอบแสดงปริมาณการเข้าชมมีความแตกต่างอย่างมากระหว่างถนนที่ไม่มีใครใช้ (ขอบที่มีน้ำหนักเป็นศูนย์) และถนนที่ไม่มีเลย (ไม่มีขอบ)
มันขึ้นอยู่กับบริบท โดยทั่วไปใช่ขอบของศูนย์และน้ำหนักเชิงลบอาจได้รับอนุญาต ในบางกรณีน้ำหนักขอบอาจต้องไม่เป็นลบหรือเป็นบวกอย่างเคร่งครัด (ตัวอย่างเช่นอัลกอริทึมของ Dijkstra ต้องการให้น้ำหนักไม่เป็นลบ)
เช่นเดียวกับคำตอบอื่น ๆ คุณมีอิสระที่จะพิจารณา (หรือแยกออกจากการพิจารณา) กราฟถ่วงน้ำหนักที่มีขอบเป็นศูนย์
ตามที่กล่าวไว้ในประสบการณ์ของฉันการประชุมตามปกติในการใช้งานกราฟน้ำหนักส่วนใหญ่คือการทำให้ไม่มีความแตกต่างระหว่างขอบที่มีน้ำหนักเป็นศูนย์และการไม่มีขอบ หนึ่งในเหตุผลนี้ก็คือว่าโดยทั่วไปแล้วกราฟถ่วงน้ำหนักแสดงเป็นภาพรวมของmultigraphsซึ่งจะเป็นภาพรวมของกราฟที่เรียบง่าย
โดยเฉพาะการเขียนด้วยลายมือเป็นกราฟที่ (ซึ่งแตกต่างจากกราฟอย่างง่าย ) ช่วยให้ขอบหลายจุดระหว่างโหนดคู่เดียวกัน ในขณะที่ในกราฟอย่างง่ายคู่ของโหนดใด ๆ ที่เชื่อมต่อเสมอโดย 0 หรือ 1 ขอบคู่ของโหนดในการเขียนแบบหลายอาจเชื่อมต่อโดย 0, 1, 2, 3 หรือมากกว่า (แต่มักจะเป็นจำนวนเต็มไม่ลบ ) ขอบ
การวางกราฟมัลติจิ้งเพื่อให้ได้จำนวนเศษส่วนระหว่างขอบของโหนดจากนั้นนำไปสู่การพิจารณากราฟถ่วงน้ำหนักและอัลกอริธึมหลายอย่างที่ทำงานกับกราฟมัลติกราฟแบบสุ่มสามารถทำงานบนกราฟถ่วงน้ำหนักเช่นนั้นได้ แต่สำหรับขั้นตอนวิธีการดังกล่าว "น้ำหนัก" ของขอบจริงๆหมายถึงมันหลายหลาก ดังนั้นเมื่อตีความอย่างนี้แล้วจะไม่มีความแตกต่างที่มีความหมายระหว่าง "no edge" และ "0 edge" ระหว่างคู่ของโหนด: ทั้งคู่หมายถึงสิ่งเดียวกัน
แน่นอน "กราฟถ่วงน้ำหนัก" ตามคำจำกัดความเป็นเพียงกราฟที่มีจำนวนที่เกี่ยวข้องกับแต่ละขอบและเป็นไปได้อย่างสมบูรณ์ในการตีความน้ำหนักเป็นอย่างอื่นนอกเหนือจากหลายหลากซึ่งในกรณีนี้ความแตกต่างระหว่างไม่มีขอบและศูนย์น้ำหนัก ขอบอาจมีความหมาย แต่การพยายามใช้อัลกอริธึมการเขียนด้วยลายมือแบบมาตรฐานกับ "กราฟถ่วงน้ำหนักที่แปลกประหลาด" นั้นไม่น่าจะให้ผลลัพธ์ที่จะสมเหตุสมผลในแง่ของการตีความทางเลือก (ไม่ใช่หลายหลาก) ของน้ำหนักขอบ
ลองนึกถึงกราฟของระบบถนนในเคมบริดจ์สหราชอาณาจักรบันทึกร่วมกันระหว่างนักปั่นจักรยานและคนขับรถดังนั้นส่วนใหญ่จึงเป็นขอบ การทำเช่นนี้ลดค่าใช้จ่ายในการบำรุงรักษาข้อมูลลงอย่างมาก
ตอนนี้ถ้าเรากำหนดน้ำหนักขอบเป็นเวลาเดินทางในไม่กี่วินาทีขอบแต่ละข้างจะมีน้ำหนักสองน้ำหนักหนึ่งคันสำหรับรถยนต์อับเรนจ์สำหรับจักรยาน น้ำหนักบางอย่างจะไม่มีที่สิ้นสุดเนื่องจากรถยนต์ไม่ได้รับอนุญาตให้ใช้เส้นทางจักรยาน
ทีนี้ลองพิจารณาทางแยกสองแห่งที่อยู่ใกล้กันมากดังนั้นพวกเขาจะได้รับการเชื่อมต่อด้วยเสาสองสามเสาที่หยุดคนขับรถ (ตัวอย่างเช่นทางแยกที่ซึ่งรถยนต์ขับรถสามารถเลี้ยวซ้ายได้เท่านั้น แต่นักปั่นจักรยานสามารถไปในทิศทางใดก็ได้) จากนั้นเราจะได้น้ำหนักที่ไม่มีขีด จำกัด จากนักขับรถและ 0 น้ำหนักสำหรับนักปั่น
(เห็นได้ชัดว่าสามารถประมวลผลกราฟล่วงหน้าเพื่อสร้างกราฟที่ง่ายขึ้นสำหรับการกำหนดเส้นทางของนักปั่นจักรยานก่อนที่จะกำจัดเส้นทางที่ดีที่สุด)
ดูเหมือนว่าคุณกำลังใช้น้ำหนักเพื่อลองและแสดงสองแง่มุมที่แตกต่างกันอย่างชัดเจนของกราฟ ที่แรกก็คือว่ากราฟมีขอบ (วาด) จริง ๆ และที่สองคือน้ำหนักจริง
ดังที่คุณสังเกตเห็นว่าคุณตกอยู่ในสถานการณ์ที่สับสนถ้าคุณใช้ 'ไม่เป็นศูนย์' เป็นตัวบ่งชี้ว่ามีขอบ (และจะต้องถูกดึงออกมาหรือมีรายชื่ออยู่) ในขณะเดียวกันก็พบสถานการณ์ โดยที่ศูนย์น้ำหนักถูกจัดประเภทว่าถูกต้อง
โดยพื้นฐานแล้วคุณจะต้องมีอีกวิธีหนึ่งในการแสดงถึงขอบ (สมมติว่าคุณต้องการจริง ๆ และไม่สามารถสร้างน้ำหนัก N ^ 2 ได้ แต่จากนั้นคุณตกหลุมพรางของการตัดสินใจว่าจะทำอย่างไรกับลูป ขอบด้านหลัง ... )