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 ;
}
}