import
java.util.*;
public
class
GFG {
static
void
constructConnectedComponent(
int
[] A,
int
N)
{
boolean
flag =
false
;
Map<Integer, List<Integer> > mp
=
new
HashMap<Integer, List<Integer> >();
for
(
int
i =
0
; i < N; i++) {
if
(!mp.containsKey(A[i])) {
mp.put(A[i],
new
ArrayList<Integer>());
}
mp.get(A[i]).add(i);
if
(A[i] !=
1
) {
flag =
true
;
}
}
if
(!flag) {
System.out.println(
"Graph already connected."
);
return
;
}
for
(Map.Entry<Integer, List<Integer> > entry :
mp.entrySet()) {
if
(entry.getValue().size() % entry.getKey()
!=
0
) {
System.out.println(-
1
);
return
;
}
}
List<Tuple<Integer, Integer> > edges
=
new
ArrayList<Tuple<Integer, Integer> >();
for
(Map.Entry<Integer, List<Integer> > entry :
mp.entrySet()) {
List<Integer> nodes = entry.getValue();
while
(nodes.size() >
0
) {
int
cnt =
0
;
List<Integer> componentNodes
=
new
ArrayList<Integer>();
while
(cnt != entry.getKey()) {
componentNodes.add(
nodes.get(nodes.size() -
1
));
nodes.remove(nodes.size() -
1
);
cnt++;
}
for
(
int
i =
1
; i < componentNodes.size();
i++) {
edges.add(
new
Tuple<Integer, Integer>(
componentNodes.get(i),
componentNodes.get(i -
1
)));
}
}
}
System.out.print(
"["
);
for
(
int
i =
0
; i < edges.size(); i++) {
System.out.printf(
"(%d, %d)"
,
edges.get(i).getItem1(),
edges.get(i).getItem2());
if
(i != edges.size() -
1
) {
System.out.print(
", "
);
}
}
System.out.println(
"]"
);
}
public
static
void
main(String[] args)
{
int
N =
5
;
int
[] A = {
2
,
1
,
1
,
2
,
1
};
constructConnectedComponent(A, N);
}
}
class
Tuple<X, Y> {
public
final
X x;
public
final
Y y;
public
Tuple(X x, Y y)
{
this
.x = x;
this
.y = y;
}
public
X getItem1() {
return
x; }
public
Y getItem2() {
return
y; }
}