CSES - Yksikäsitteisyys

Tehtäväsi on tutkia, onko verkon pienin virittävä puu yksikäsitteinen eli on tarkalleen yksi tapa muodostaa virittävä puu, jonka paino on pienin.

Voit olettaa, että solmuja on enintään 50 ja luokan metodeita kutsutaan enintään 100 kertaa. Jokaisen kaaren paino on kokonaisluku välillä 1 \dots 1000.

Python

Toteuta tiedostoon uniquetree.py luokka UniqueTree, jossa on seuraavat metodit:

  • konstruktori, jolle annetaan solmujen määrä
  • add_edge lisää solmujen a ja b välille kaaren, jonka paino on x
  • check ilmoittaa, onko verkon pienin virittävä puu yksikäsitteinen (jos verkko ei ole yhtenäinen, haluttu vastaus on False)
class UniqueTree:
    def __init__(self,n):
        # TODO

    def add_edge(self,a,b,x):
        # TODO

    def check(self):
        # TODO

if __name__ == "__main__":
    u = UniqueTree(4)
    u.add_edge(1,2,2)
    u.add_edge(1,3,3)
    print(u.check()) # False
    u.add_edge(1,4,2)
    print(u.check()) # True
    u.add_edge(3,4,4)
    print(u.check()) # True
    u.add_edge(2,4,1)
    print(u.check()) # False

Java

Toteuta tiedostoon UniqueTree.java luokka UniqueTree, jossa on seuraavat metodit:

  • konstruktori, jolle annetaan solmujen määrä
  • addEdge lisää solmujen a ja b välille kaaren, jonka paino on x
  • check ilmoittaa, onko verkon pienin virittävä puu yksikäsitteinen (jos verkko ei ole yhtenäinen, haluttu vastaus on false)
public class UniqueTree {
    public UniqueTree(int n) {
        // TODO
    }

    public void addEdge(int a, int b, int x) {
        // TODO
    }

    public boolean check() {
        // TODO
    }

    public static void main(String[] args) {
        UniqueTree u = new UniqueTree(4);
        u.addEdge(1,2,2);
        u.addEdge(1,3,3);
        System.out.println(u.check()); // false
        u.addEdge(1,4,2);
        System.out.println(u.check()); // true
        u.addEdge(3,4,4);
        System.out.println(u.check()); // true
        u.addEdge(2,4,1);
        System.out.println(u.check()); // false
    }
}