import java.util.* ;
class Graph {
ArrayList< Node> nodes;
public Graph( ArrayList< Node> nds) {
nodes = nds;
}
public Graph( ) {
nodes = new ArrayList< Node> ( ) ;
}
public void addNode( Node nd) {
nodes.add ( nd) ;
}
public Graph square( ) {
ArrayList< Node> sqnodes = new ArrayList< Node> ( ) ;
for ( Node nd : this .nodes ) {
Node newNd = new Node( nd.id ) ; // make new node with empty adjList
for ( Node nd2 : this .nodes ) {
if ( nd != nd2 && nd.distTwoOrLess ( nd2) ) {
newNd.addNeighbour ( nd2) ;
}
}
sqnodes.add ( newNd) ;
}
return new Graph( sqnodes) ;
}
for ( Node nd : this .nodes ) {
s += nd;
}
return s;
}
}
class Node {
public ArrayList< Node> adjList;
id = n;
adjList = new ArrayList< Node> ( ) ;
}
public boolean distTwoOrLess( Node other) {
for ( Node nd : this .adjList ) {
if ( nd== other) {
return true ; // other node found directly in adjList, distance is 1
}
for ( Node nd2 : nd.adjList ) {
if ( nd2== other) {
return true ; // other node found at distance 2
}
}
}
// reached end of adjList + adjLists of all nodes therein
// with no link less than 2 found
return false ;
}
public void addNeighbour( Node nd) {
if ( ! this .adjList .contains ( nd) ) {
this .adjList .add ( nd) ;
}
}
String s
= "\n Node: " + this .
id ; s += "\n Neighbours: " ;
for ( Node nd : this .adjList ) {
s += nd.id + ", " ;
}
return s + "\n " ;
}
}
class SquareTest {
public static void main
( String [ ] args
) {
Node a = new Node( "A" ) ;
Node b = new Node( "B" ) ;
Node c = new Node( "C" ) ;
Node d = new Node( "D" ) ;
Node e = new Node( "E" ) ;
a.addNeighbour ( d) ;
b.addNeighbour ( c) ;
c.addNeighbour ( b) ;
c.addNeighbour ( d) ;
d.addNeighbour ( a) ;
d.addNeighbour ( c) ;
d.addNeighbour ( e) ;
e.addNeighbour ( d) ;
Graph test = new Graph( ) ;
Node[ ] nds = { a,b,c,d,e} ;
for ( Node nd : nds) {
test.addNode ( nd) ;
}
/* Original graph:
a------d--e
/
c´----b
*/
System .
out .
println ( "Original graph:" ) ;
Graph sq = test.square ( ) ;
/* New graph:
Node: a
Neighbours: c, d, e,
Node: b
Neighbours: c, d,
Node: c
Neighbours: a, b, d, e,
Node: d
Neighbours: a, b, c, e,
Node: e
Neighbours: a, c, d,
+ a confusing ASCII graph :--D
________
/ \
a__ ____e
| \ / /
| d-- /
c--´---´ `b
\________/
*/
System .
out .
println ( "------------------------\n " ) ; System .
out .
println ( "Square of the original graph:" ) ;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKY2xhc3MgR3JhcGggewoKICAgIEFycmF5TGlzdDxOb2RlPiBub2RlczsKCiAgICBwdWJsaWMgR3JhcGgoQXJyYXlMaXN0PE5vZGU+IG5kcykgewoJbm9kZXMgPSBuZHM7CiAgICB9CgogICAgcHVibGljIEdyYXBoKCkgewoJbm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CiAgICB9CiAKICAgIHB1YmxpYyB2b2lkIGFkZE5vZGUoTm9kZSBuZCkgewoJbm9kZXMuYWRkKG5kKTsKICAgIH0KCiAgICBwdWJsaWMgR3JhcGggc3F1YXJlKCkgewoJQXJyYXlMaXN0PE5vZGU+IHNxbm9kZXMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7CgoJZm9yIChOb2RlIG5kIDogdGhpcy5ub2RlcykgewoJICAgIE5vZGUgbmV3TmQgPSBuZXcgTm9kZShuZC5pZCk7IC8vIG1ha2UgbmV3IG5vZGUgd2l0aCBlbXB0eSBhZGpMaXN0CgkgICAgZm9yIChOb2RlIG5kMiA6IHRoaXMubm9kZXMpIHsKCQlpZiAobmQgIT0gbmQyICYmIG5kLmRpc3RUd29Pckxlc3MobmQyKSkgewoJCSAgICBuZXdOZC5hZGROZWlnaGJvdXIobmQyKTsKCQl9CgkgICAgfQoJICAgIHNxbm9kZXMuYWRkKG5ld05kKTsKCX0KCglyZXR1cm4gbmV3IEdyYXBoKHNxbm9kZXMpOwogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CglTdHJpbmcgcyA9ICIiOwoJZm9yIChOb2RlIG5kIDogdGhpcy5ub2RlcykgewoJICAgIHMgKz0gbmQ7Cgl9CglyZXR1cm4gczsgCiAgICB9Cgp9CgpjbGFzcyBOb2RlIHsKCiAgICBwdWJsaWMgU3RyaW5nIGlkOwogICAgcHVibGljIEFycmF5TGlzdDxOb2RlPiBhZGpMaXN0OwoKICAgIHB1YmxpYyBOb2RlKFN0cmluZyBuKSB7CglpZCA9IG47CglhZGpMaXN0ID0gbmV3IEFycmF5TGlzdDxOb2RlPigpOwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIGRpc3RUd29Pckxlc3MoTm9kZSBvdGhlcikgewoJZm9yIChOb2RlIG5kIDogdGhpcy5hZGpMaXN0KSB7CgkgICAgaWYgKG5kPT1vdGhlcikgewoJCXJldHVybiB0cnVlOyAvLyBvdGhlciBub2RlIGZvdW5kIGRpcmVjdGx5IGluIGFkakxpc3QsIGRpc3RhbmNlIGlzIDEKCSAgICB9CgkgICAgZm9yIChOb2RlIG5kMiA6IG5kLmFkakxpc3QpIHsKCQlpZiAobmQyPT1vdGhlcikgewoJCSAgICByZXR1cm4gdHJ1ZTsgLy8gb3RoZXIgbm9kZSBmb3VuZCBhdCBkaXN0YW5jZSAyCgkJfQoJICAgIH0KCX0KCS8vIHJlYWNoZWQgZW5kIG9mIGFkakxpc3QgKyBhZGpMaXN0cyBvZiBhbGwgbm9kZXMgdGhlcmVpbgoJLy8gd2l0aCBubyBsaW5rIGxlc3MgdGhhbiAyIGZvdW5kCglyZXR1cm4gZmFsc2U7IAogICAgfQoKICAgIHB1YmxpYyB2b2lkIGFkZE5laWdoYm91cihOb2RlIG5kKSB7CglpZiAoIXRoaXMuYWRqTGlzdC5jb250YWlucyhuZCkpIHsKCSAgICB0aGlzLmFkakxpc3QuYWRkKG5kKTsKCX0KICAgIH0gICAgCiAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJU3RyaW5nIHMgPSAiXG5Ob2RlOiAiICsgdGhpcy5pZDsKCXMgKz0gIlxuTmVpZ2hib3VyczogIjsKCWZvciAoTm9kZSBuZCA6IHRoaXMuYWRqTGlzdCkgewoJICAgIHMgKz0gbmQuaWQgKyAiLCAiOwoJfQoJcmV0dXJuIHMgKyAiXG4iOwogICAgfQp9CgpjbGFzcyBTcXVhcmVUZXN0IHsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgoJTm9kZSBhID0gbmV3IE5vZGUoIkEiKTsKCU5vZGUgYiA9IG5ldyBOb2RlKCJCIik7CglOb2RlIGMgPSBuZXcgTm9kZSgiQyIpOwoJTm9kZSBkID0gbmV3IE5vZGUoIkQiKTsKCU5vZGUgZSA9IG5ldyBOb2RlKCJFIik7CgoJYS5hZGROZWlnaGJvdXIoZCk7CgliLmFkZE5laWdoYm91cihjKTsKCWMuYWRkTmVpZ2hib3VyKGIpOwoJYy5hZGROZWlnaGJvdXIoZCk7CglkLmFkZE5laWdoYm91cihhKTsKCWQuYWRkTmVpZ2hib3VyKGMpOwoJZC5hZGROZWlnaGJvdXIoZSk7CgllLmFkZE5laWdoYm91cihkKTsKCglHcmFwaCB0ZXN0ID0gbmV3IEdyYXBoKCk7CglOb2RlW10gbmRzID0gIHthLGIsYyxkLGV9OwoJZm9yIChOb2RlIG5kIDogbmRzKSB7CgkgICAgdGVzdC5hZGROb2RlKG5kKTsKCX0KCgkvKiBPcmlnaW5hbCBncmFwaDoKICAgICAgICAgICAgIGEtLS0tLS1kLS1lCiAgICAgICAgICAgICAgICAgICAvCgkgICAgICAgICBjwrQtLS0tYgoJICovCglTeXN0ZW0ub3V0LnByaW50bG4oIk9yaWdpbmFsIGdyYXBoOiIpOwoJU3lzdGVtLm91dC5wcmludGxuKHRlc3QpOwoKCgoJR3JhcGggc3EgPSB0ZXN0LnNxdWFyZSgpOwoKCS8qIE5ldyBncmFwaDoKCgkgICBOb2RlOiBhCgkgICBOZWlnaGJvdXJzOiBjLCBkLCBlLCAKCgkgICBOb2RlOiBiCgkgICBOZWlnaGJvdXJzOiBjLCBkLCAKCgkgICBOb2RlOiBjCgkgICBOZWlnaGJvdXJzOiBhLCBiLCBkLCBlLCAKCgkgICBOb2RlOiBkCgkgICBOZWlnaGJvdXJzOiBhLCBiLCBjLCBlLCAKCgkgICBOb2RlOiBlCgkgICBOZWlnaGJvdXJzOiBhLCBjLCBkLCAKCgkgICArIGEgY29uZnVzaW5nIEFTQ0lJIGdyYXBoIDotLUQKCSAgICAgIF9fX19fX19fCgkgICAgIC8gICAgICAgIFwKCSAgICBhX18gICBfX19fZQogICAgICAgICAgICB8ICBcIC8gICAvCgkgICAgfCAgIGQtLSAvCiAgICAgICAgICAgIGMtLcK0LS0twrQgYGIKICAgICAgICAgICAgIFxfX19fX19fXy8KCSAgICAKCSAqLwoKCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKCVN5c3RlbS5vdXQucHJpbnRsbigiU3F1YXJlIG9mIHRoZSBvcmlnaW5hbCBncmFwaDoiKTsKCVN5c3RlbS5vdXQucHJpbnRsbihzcSk7CgoKICAgIH0KCn0=
stdout
Original graph:
Node: A
Neighbours: D,
Node: B
Neighbours: C,
Node: C
Neighbours: B, D,
Node: D
Neighbours: A, C, E,
Node: E
Neighbours: D,
------------------------
Square of the original graph:
Node: A
Neighbours: C, D, E,
Node: B
Neighbours: C, D,
Node: C
Neighbours: A, B, D, E,
Node: D
Neighbours: A, B, C, E,
Node: E
Neighbours: A, C, D,