#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 AdjList
* adlist
= ( struct AdjList
* ) malloc ( V
* sizeof ( struct AdjList
) ) ; int i;
for ( i= 0 ; i< V; i++ )
adlist[ i] .head = NULL;
graph.array = adlist;
graph.V = V;
return graph;
}
// Adds an edge to an undirected graph
void addEdge( struct Graph graph, int src, int dest)
{
struct AdjListNode * node = newAdjListNode( dest) ;
node -> next = graph.array [ src] .head ;
graph.array [ src] .head = node;
node = newAdjListNode( src) ;
node -> next = graph.array [ dest] .head ;
graph.array [ dest] .head = node;
}
// 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 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KIAovLyBBIHN0cnVjdHVyZSB0byByZXByZXNlbnQgYW4gYWRqYWNlbmN5IGxpc3Qgbm9kZQpzdHJ1Y3QgQWRqTGlzdE5vZGUKewogICAgaW50IGRlc3Q7CiAgICBzdHJ1Y3QgQWRqTGlzdE5vZGUqIG5leHQ7Cn07CiAKLy8gQSBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGFuIGFkamFjZW5jeSBsaWF0CnN0cnVjdCBBZGpMaXN0CnsKICAgIHN0cnVjdCBBZGpMaXN0Tm9kZSAqaGVhZDsgIC8vIHBvaW50ZXIgdG8gaGVhZCBub2RlIG9mIGxpc3QKfTsKIAovLyBBIHN0cnVjdHVyZSB0byByZXByZXNlbnQgYSBncmFwaC4gQSBncmFwaCBpcyBhbiBhcnJheSBvZiBhZGphY2VuY3kgbGlzdHMuCi8vIFNpemUgb2YgYXJyYXkgd2lsbCBiZSBWIChudW1iZXIgb2YgdmVydGljZXMgaW4gZ3JhcGgpCnN0cnVjdCBHcmFwaAp7CiAgICBpbnQgVjsKICAgIHN0cnVjdCBBZGpMaXN0KiBhcnJheTsKfTsKIAovLyBBIHV0aWxpdHkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGFkamFjZW5jeSBsaXN0IG5vZGUKc3RydWN0IEFkakxpc3ROb2RlKiBuZXdBZGpMaXN0Tm9kZShpbnQgZGVzdCkKewogICAgc3RydWN0IEFkakxpc3ROb2RlKiBuZXdOb2RlID0KICAgICAgICAgICAgKHN0cnVjdCBBZGpMaXN0Tm9kZSopIG1hbGxvYyhzaXplb2Yoc3RydWN0IEFkakxpc3ROb2RlKSk7CiAgICBuZXdOb2RlLT5kZXN0ID0gZGVzdDsKICAgIG5ld05vZGUtPm5leHQgPSBOVUxMOwogICAgcmV0dXJuIG5ld05vZGU7Cn0KIAovLyBBIHV0aWxpdHkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgZ3JhcGggb2YgViB2ZXJ0aWNlcwpzdHJ1Y3QgR3JhcGggY3JlYXRlR3JhcGgoaW50IFYpCnsKICAgIHN0cnVjdCBHcmFwaCBncmFwaDsKICAgIHN0cnVjdCBBZGpMaXN0KiBhZGxpc3QgPSAoc3RydWN0IEFkakxpc3QqKW1hbGxvYyhWICogc2l6ZW9mKHN0cnVjdCBBZGpMaXN0KSk7CiAgICBpbnQgaTsKICAgIGZvcihpPTA7aTxWO2krKykKICAgIGFkbGlzdFtpXS5oZWFkID0gTlVMTDsKICAgIAogICAgZ3JhcGguYXJyYXkgPSBhZGxpc3Q7CiAgICBncmFwaC5WID0gVjsKICAgICAgCiAKICAgIHJldHVybiBncmFwaDsKfQogCi8vIEFkZHMgYW4gZWRnZSB0byBhbiB1bmRpcmVjdGVkIGdyYXBoCnZvaWQgYWRkRWRnZShzdHJ1Y3QgR3JhcGggZ3JhcGgsIGludCBzcmMsIGludCBkZXN0KQp7CiAgIHN0cnVjdCBBZGpMaXN0Tm9kZSAqIG5vZGUgPSAgbmV3QWRqTGlzdE5vZGUoZGVzdCk7CiAgIG5vZGUgLT5uZXh0ID0gZ3JhcGguYXJyYXlbc3JjXS5oZWFkOwogICBncmFwaC5hcnJheVtzcmNdLmhlYWQgPSBub2RlOwogICAKICAgbm9kZSA9ICBuZXdBZGpMaXN0Tm9kZShzcmMpOwogICBub2RlIC0+bmV4dCA9IGdyYXBoLmFycmF5W2Rlc3RdLmhlYWQ7CiAgIGdyYXBoLmFycmF5W2Rlc3RdLmhlYWQgPSBub2RlOwp9CiAKLy8gQSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHByaW50IHRoZSBhZGphY2VubmN5IGxpc3QgcmVwcmVzZW50YXRpb24gb2YgZ3JhcGgKdm9pZCBwcmludEdyYXBoKHN0cnVjdCBHcmFwaCBncmFwaCkKewogICAgaW50IHY7CiAgICBmb3IgKHYgPSAwOyB2IDwgZ3JhcGguVjsgKyt2KQogICAgewogICAgICAgIHN0cnVjdCBBZGpMaXN0Tm9kZSogcENyYXdsID0gZ3JhcGguYXJyYXlbdl0uaGVhZDsKICAgICAgICBwcmludGYoIlxuIEFkamFjZW5jeSBsaXN0IG9mIHZlcnRleCAlZFxuIGhlYWQgIiwgdik7CiAgICAgICAgd2hpbGUgKHBDcmF3bCkKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ZigiLT4gJWQiLCBwQ3Jhd2wtPmRlc3QpOwogICAgICAgICAgICBwQ3Jhd2wgPSBwQ3Jhd2wtPm5leHQ7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiXG4iKTsKICAgIH0KfQogCi8vIERyaXZlciBwcm9ncmFtIHRvIHRlc3QgYWJvdmUgZnVuY3Rpb25zCmludCBtYWluKCkKewogICAgLy8gY3JlYXRlIHRoZSBncmFwaCBnaXZlbiBpbiBhYm92ZSBmdWd1cmUKICAgIGludCBWID0gNTsKICAgIHN0cnVjdCBHcmFwaCBncmFwaCA9IGNyZWF0ZUdyYXBoKFYpOwogICAgYWRkRWRnZShncmFwaCwgMCwgMSk7CiAgICBhZGRFZGdlKGdyYXBoLCAwLCA0KTsKICAgIGFkZEVkZ2UoZ3JhcGgsIDEsIDIpOwogICAgYWRkRWRnZShncmFwaCwgMSwgMyk7CiAgICBhZGRFZGdlKGdyYXBoLCAxLCA0KTsKICAgIGFkZEVkZ2UoZ3JhcGgsIDIsIDMpOwogICAgYWRkRWRnZShncmFwaCwgMywgNCk7CiAKICAgIC8vIHByaW50IHRoZSBhZGphY2VuY3kgbGlzdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWJvdmUgZ3JhcGgKICAgIHByaW50R3JhcGgoZ3JhcGgpOwogCiAgICByZXR1cm4gMDsKfQ==