// A C Program to demonstrate adjacency list representation of graphs
#include <stdio.h>
#include <stdlib.h>
// A structure to represent an adjacency list node
struct AdjListNode
{
int dest;
struct AdjListNode* next;
} ;
// A structure to represent an adjacency liat
struct AdjList
{
struct AdjListNode * head; // pointer to head node of list
} ;
// A structure to represent a graph. A graph is an array of adjacency lists.
// Size of array will be V (number of vertices in graph)
struct Graph
{
int V;
struct AdjList* array;
} ;
// A utility function to create a new adjacency list node
struct AdjListNode* newAdjListNode( int dest)
{
struct AdjListNode* newNode =
( struct AdjListNode
* ) malloc ( sizeof ( struct AdjListNode
) ) ; newNode-> dest = dest;
newNode-> next = NULL;
return newNode;
}
// A utility function that creates a graph of V vertices
struct Graph* createGraph( int V)
{
struct Graph
* graph
= ( struct Graph
* ) malloc ( sizeof ( struct Graph
) ) ; graph-> V = V;
// Create an array of adjacency lists. Size of array will be V
graph
-> array
= ( struct AdjList
* ) malloc ( V
* sizeof ( struct AdjList
) ) ;
// Initialize each adjacency list as empty by making head as NULL
int i;
for ( i = 0 ; i < V; ++ i)
graph-> array[ i] .head = NULL;
return graph;
}
// Adds an edge to an undirected graph
void addEdge( struct Graph* graph, int src, int dest)
{
// Add an edge from src to dest. A new node is added to the adjacency
// list of src. The node is added at the begining
struct AdjListNode* newNode = newAdjListNode( dest) ;
newNode-> next = graph-> array[ src] .head ;
graph-> array[ src] .head = newNode;
// Since graph is undirected, add an edge from dest to src also
newNode = newAdjListNode( src) ;
newNode-> next = graph-> array[ dest] .head ;
graph-> array[ dest] .head = newNode;
}
// A utility function to print the adjacenncy list representation of graph
void printGraph( struct Graph* graph)
{
int v;
for ( v = 0 ; v < graph-> V; ++ v)
{
struct AdjListNode* pCrawl = graph-> array[ v] .head ;
printf ( "\n Adjacency list of vertex %d\n head " , v
) ; while ( pCrawl)
{
printf ( "-> %d" , pCrawl
-> dest
) ; pCrawl = pCrawl-> next;
}
}
}
// Driver program to test above functions
int main( )
{
// create the graph given in above fugure
int V = 5 ;
struct Graph* graph = createGraph( V) ;
addEdge( graph, 0 , 1 ) ;
addEdge( graph, 0 , 4 ) ;
addEdge( graph, 1 , 2 ) ;
addEdge( graph, 1 , 3 ) ;
addEdge( graph, 1 , 4 ) ;
addEdge( graph, 2 , 3 ) ;
addEdge( graph, 3 , 4 ) ;
// print the adjacency list representation of the above graph
printGraph( graph) ;
return 0 ;
}
Ly8gQSBDIFByb2dyYW0gdG8gZGVtb25zdHJhdGUgYWRqYWNlbmN5IGxpc3QgcmVwcmVzZW50YXRpb24gb2YgZ3JhcGhzCiAKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KIAovLyBBIHN0cnVjdHVyZSB0byByZXByZXNlbnQgYW4gYWRqYWNlbmN5IGxpc3Qgbm9kZQpzdHJ1Y3QgQWRqTGlzdE5vZGUKewogICAgaW50IGRlc3Q7CiAgICBzdHJ1Y3QgQWRqTGlzdE5vZGUqIG5leHQ7Cn07CiAKLy8gQSBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGFuIGFkamFjZW5jeSBsaWF0CnN0cnVjdCBBZGpMaXN0CnsKICAgIHN0cnVjdCBBZGpMaXN0Tm9kZSAqaGVhZDsgIC8vIHBvaW50ZXIgdG8gaGVhZCBub2RlIG9mIGxpc3QKfTsKIAovLyBBIHN0cnVjdHVyZSB0byByZXByZXNlbnQgYSBncmFwaC4gQSBncmFwaCBpcyBhbiBhcnJheSBvZiBhZGphY2VuY3kgbGlzdHMuCi8vIFNpemUgb2YgYXJyYXkgd2lsbCBiZSBWIChudW1iZXIgb2YgdmVydGljZXMgaW4gZ3JhcGgpCnN0cnVjdCBHcmFwaAp7CiAgICBpbnQgVjsKICAgIHN0cnVjdCBBZGpMaXN0KiBhcnJheTsKfTsKIAovLyBBIHV0aWxpdHkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGFkamFjZW5jeSBsaXN0IG5vZGUKc3RydWN0IEFkakxpc3ROb2RlKiBuZXdBZGpMaXN0Tm9kZShpbnQgZGVzdCkKewogICAgc3RydWN0IEFkakxpc3ROb2RlKiBuZXdOb2RlID0KICAgICAgICAgICAgKHN0cnVjdCBBZGpMaXN0Tm9kZSopIG1hbGxvYyhzaXplb2Yoc3RydWN0IEFkakxpc3ROb2RlKSk7CiAgICBuZXdOb2RlLT5kZXN0ID0gZGVzdDsKICAgIG5ld05vZGUtPm5leHQgPSBOVUxMOwogICAgcmV0dXJuIG5ld05vZGU7Cn0KIAovLyBBIHV0aWxpdHkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgZ3JhcGggb2YgViB2ZXJ0aWNlcwpzdHJ1Y3QgR3JhcGgqIGNyZWF0ZUdyYXBoKGludCBWKQp7CiAgICBzdHJ1Y3QgR3JhcGgqIGdyYXBoID0gKHN0cnVjdCBHcmFwaCopIG1hbGxvYyhzaXplb2Yoc3RydWN0IEdyYXBoKSk7CiAgICBncmFwaC0+ViA9IFY7CiAKICAgIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBhZGphY2VuY3kgbGlzdHMuICBTaXplIG9mIGFycmF5IHdpbGwgYmUgVgogICAgZ3JhcGgtPmFycmF5ID0gKHN0cnVjdCBBZGpMaXN0KikgbWFsbG9jKFYgKiBzaXplb2Yoc3RydWN0IEFkakxpc3QpKTsKIAogICAgIC8vIEluaXRpYWxpemUgZWFjaCBhZGphY2VuY3kgbGlzdCBhcyBlbXB0eSBieSBtYWtpbmcgaGVhZCBhcyBOVUxMCiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBWOyArK2kpCiAgICAgICAgZ3JhcGgtPmFycmF5W2ldLmhlYWQgPSBOVUxMOwogCiAgICByZXR1cm4gZ3JhcGg7Cn0KIAovLyBBZGRzIGFuIGVkZ2UgdG8gYW4gdW5kaXJlY3RlZCBncmFwaAp2b2lkIGFkZEVkZ2Uoc3RydWN0IEdyYXBoKiBncmFwaCwgaW50IHNyYywgaW50IGRlc3QpCnsKICAgIC8vIEFkZCBhbiBlZGdlIGZyb20gc3JjIHRvIGRlc3QuICBBIG5ldyBub2RlIGlzIGFkZGVkIHRvIHRoZSBhZGphY2VuY3kKICAgIC8vIGxpc3Qgb2Ygc3JjLiAgVGhlIG5vZGUgaXMgYWRkZWQgYXQgdGhlIGJlZ2luaW5nCiAgICBzdHJ1Y3QgQWRqTGlzdE5vZGUqIG5ld05vZGUgPSBuZXdBZGpMaXN0Tm9kZShkZXN0KTsKICAgIG5ld05vZGUtPm5leHQgPSBncmFwaC0+YXJyYXlbc3JjXS5oZWFkOwogICAgZ3JhcGgtPmFycmF5W3NyY10uaGVhZCA9IG5ld05vZGU7CiAKICAgIC8vIFNpbmNlIGdyYXBoIGlzIHVuZGlyZWN0ZWQsIGFkZCBhbiBlZGdlIGZyb20gZGVzdCB0byBzcmMgYWxzbwogICAgbmV3Tm9kZSA9IG5ld0Fkakxpc3ROb2RlKHNyYyk7CiAgICBuZXdOb2RlLT5uZXh0ID0gZ3JhcGgtPmFycmF5W2Rlc3RdLmhlYWQ7CiAgICBncmFwaC0+YXJyYXlbZGVzdF0uaGVhZCA9IG5ld05vZGU7Cn0KIAovLyBBIHV0aWxpdHkgZnVuY3Rpb24gdG8gcHJpbnQgdGhlIGFkamFjZW5uY3kgbGlzdCByZXByZXNlbnRhdGlvbiBvZiBncmFwaAp2b2lkIHByaW50R3JhcGgoc3RydWN0IEdyYXBoKiBncmFwaCkKewogICAgaW50IHY7CiAgICBmb3IgKHYgPSAwOyB2IDwgZ3JhcGgtPlY7ICsrdikKICAgIHsKICAgICAgICBzdHJ1Y3QgQWRqTGlzdE5vZGUqIHBDcmF3bCA9IGdyYXBoLT5hcnJheVt2XS5oZWFkOwogICAgICAgIHByaW50ZigiXG4gQWRqYWNlbmN5IGxpc3Qgb2YgdmVydGV4ICVkXG4gaGVhZCAiLCB2KTsKICAgICAgICB3aGlsZSAocENyYXdsKQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCItPiAlZCIsIHBDcmF3bC0+ZGVzdCk7CiAgICAgICAgICAgIHBDcmF3bCA9IHBDcmF3bC0+bmV4dDsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgfQp9CiAKLy8gRHJpdmVyIHByb2dyYW0gdG8gdGVzdCBhYm92ZSBmdW5jdGlvbnMKaW50IG1haW4oKQp7CiAgICAvLyBjcmVhdGUgdGhlIGdyYXBoIGdpdmVuIGluIGFib3ZlIGZ1Z3VyZQogICAgaW50IFYgPSA1OwogICAgc3RydWN0IEdyYXBoKiBncmFwaCA9IGNyZWF0ZUdyYXBoKFYpOwogICAgYWRkRWRnZShncmFwaCwgMCwgMSk7CiAgICBhZGRFZGdlKGdyYXBoLCAwLCA0KTsKICAgIGFkZEVkZ2UoZ3JhcGgsIDEsIDIpOwogICAgYWRkRWRnZShncmFwaCwgMSwgMyk7CiAgICBhZGRFZGdlKGdyYXBoLCAxLCA0KTsKICAgIGFkZEVkZ2UoZ3JhcGgsIDIsIDMpOwogICAgYWRkRWRnZShncmFwaCwgMywgNCk7CiAKICAgIC8vIHByaW50IHRoZSBhZGphY2VuY3kgbGlzdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWJvdmUgZ3JhcGgKICAgIHByaW50R3JhcGgoZ3JhcGgpOwogCiAgICByZXR1cm4gMDsKfQ==