package graph;
import java.util.Iterator;
import java.util.Scanner;
public class Graph {
private final int V;
private int E;
private Bag<Integer>[] adj;
public Graph(int V) {
this.V=V;
adj=(Bag<Integer>[])new Bag[V];
for (int i = 0; i < V; i++) {
adj[i]=new Bag<>();
}
}
public Graph(Scanner sc) {
this(sc.nextInt());
int E=sc.nextInt();
for (int i = 0; i < E; i++) {
int v=sc.nextInt();
int w=sc.nextInt();
addEdge(v, w);
}
}
public int V(){
return V;
}
public int E(){
return E;
}
public void addEdge(int v,int w){
adj[v].add(w);
adj[w].add(v);
E++;
}
public Iterable<Integer> adj(int v){
return adj[v];
}
@Override
public String toString() {
String s=V+"vertices, "+E+" edges\n";
for (int i = 0; i < V; i++) {
s+=i+":";
for (int w : adj(i)) {
s+=w+" ";
}
s+="\n";
}
return s;
}
static class Bag<Item> implements Iterable<Item>{
private Node first;
private class Node{
Item item;
Node next;
}
public void add(Item item){
Node oldFirst=first;
first=new Node();
first.item=item;
first.next=oldFirst;
}
@Override
public Iterator<Item> iterator() {
return new ListIterator();
}
private class ListIterator implements Iterator<Item> {
private Node current=first;
@Override
public boolean hasNext() {
return current!=null;
}
@Override
public Item next() {
Item item=current.item;
current=current.next;
return item;
}
public void remove(){
}
}
}
}
package graph;
public class Graphs {
public static int degree(Graph G,int v){
int degree=0;
for (int w : G.adj(v)) {
degree++;
}
return degree;
}
public static int maxDegree(Graph G){
int max=0;
for (int i = 0; i < G.V(); i++) {
if (degree(G, i)>max) {
max=degree(G, i);
}
}
return max;
}
public static double avgDegree(Graph G){
return 2.0*G.E()/G.V();
}
public static int numberOfSelfLoops(Graph G){
int count=0;
for (int i = 0; i < G.V(); i++) {
for (int w : G.adj(i)) {
if (i==w) {
count++;
}
}
}
return count/2;
}
}