#include #include #include int numEdges,numVertices,nextVertexNumber=0; int *tailHeader,*headTab; struct edge { int tail,head; }; typedef struct edge edgeType; edgeType *edgeTab; char **stringNameTable; int name2number(char *x) { ENTRY e,*ep; e.key=x; ep=hsearch(e,FIND); if (ep) return (int) ep->data; if (nextVertexNumber==numVertices) { printf("Too many vertices\n"); exit(0); } e.key=(char *)malloc(strlen(x)+1); if (!e.key) { printf("error 0\n"); exit(0); } strcpy(e.key,x); stringNameTable[nextVertexNumber]=e.key; e.data=(char*) nextVertexNumber; ep=hsearch(e,ENTER); if (!ep) { printf("hsearch ENTER failed!\n"); exit(0); } return nextVertexNumber++; } void readInput() { int i; char tailString[21],headString[21]; scanf("%d %d",&numVertices,&numEdges); stringNameTable=(char**) malloc(numVertices*sizeof(char*)); if (!stringNameTable) { printf("error 0\n"); exit(0); } tailHeader=(int*) malloc((numVertices+1)*sizeof(int)); if (!tailHeader) { printf("error 1\n"); exit(0); } edgeTab=(edgeType*) malloc(numEdges*sizeof(edgeType)); headTab=(int*) malloc(numEdges*sizeof(int)); if (!edgeTab || !headTab) { printf("error 2\n"); exit(0); } if (!hcreate(numVertices)) { printf("error 3\n"); exit(0); } for (i=0;itail - y->tail; if (result!=0) return result; else return x->head - y->head; } void buildAdjacencies() { /* Builds compact adjacency structure */ int duplicates=0,i,j,k; qsort(edgeTab,numEdges,sizeof(edgeType),tailThenHead); j=k=0; for (i=0;i0 && edgeTab[j].tail==edgeTab[j-1].tail && edgeTab[j].head==edgeTab[j-1].head) { duplicates++; j++; continue; } headTab[k++]=edgeTab[j++].head; } } tailHeader[numVertices]=k; if (duplicates>0) { printf("%d duplicates found & removed\n",duplicates); numEdges-=duplicates; } } void dump() { int i,j; printf(" i stringNameTable[i]\n"); for (i=0;i