http://www.ebook.edu.vn Phˆa ` n phu . lu . c A Thu . viˆe . n Graph.h Du . ´o . i d¯ˆay l`a thu . viˆe . n gˆo ` m c´ac cˆa ´ u tr´uc d˜u . liˆe . u v`a c´ac thu ˙’ tu . c cˆa ` n thiˆe ´ t hˆo ˜ tro . . viˆe . c c`ai d¯ˇa . t c´ac thuˆa . t to´an trong gi´ao tr`ınh. /************************************************** Luu y: Tat ca cac file du lieu dung voi Thu vien nay phai duoc tao bang trinh Norton Commander. **************************************************/ #if !defined(graph_h) #define graph_h #include <stdio.h> #include <conio.h> #include <alloc.h> #include <string.h> /****** Phan dinh nghia cac hang *****/ #define TRUE 1 #define FALSE 0 #define INFTY 32767 #define MAXEDGES 50 // So cuc dai cac canh #define MAXVERTICES 25 // So cuc dai cac \dd\ir nh #define MAXSTRINGS 16 // Chieu dai cuc dai xau ky tu 197 http://www.ebook.edu.vn /****** Phan dinh nghia cac kieu du lieu *****/ typedef unsigned char byte; typedef byte Boolean; typedef char DataType[MAXSTRINGS+1]; // Them mot ma ket thuc chuoi /******************************* Cau truc du lieu: don lien ket *******************************/ typedef struct VertexNode *AdjPointer; struct VertexNode { byte Vertex; int Length; int Flow; AdjPointer Next; }; typedef struct { DataType Data; AdjPointer Next; } HeadNode; typedef HeadNode *HeadPointer; typedef HeadPointer ArrayOfPointer[MAXVERTICES]; typedef struct QueueType *QueueNode; struct QueueType { byte Vertex; QueueNode Next; }; typedef struct { QueueNode Head, Tail; } Queue; typedef byte Path[MAXVERTICES]; 198 http://www.ebook.edu.vn typedef byte SetOfVertices[(MAXVERTICES%8)?((MAXVERTICES/8)+1):(MAXVERTICES/8)]; /*********************************** Danh sach da lien ket cho cac canh ***********************************/ typedef struct EdgeNode *EdgePointer; struct EdgeNode { byte Vertex[2]; EdgePointer Link[2]; }; typedef struct { char Data; EdgePointer Next; } ListEdge; typedef ListEdge *ListEdgePointer; typedef ListEdgePointer ArrayOfEdge[MAXVERTICES]; /***** Phan khai bao prototype ham *****/ void Create(AdjPointer *List); Boolean Empty(AdjPointer List); void Push(AdjPointer *List, byte Item); void Pop(AdjPointer *List, byte *Item); void CreatQueue(Queue *Q); Boolean EmptyQueue(Queue Q); void PushQueue(Queue *Q, byte Item); void PopQueue(Queue *Q, byte *Item); Boolean EmptySet(SetOfVertices S); Boolean InSet(SetOfVertices S, byte Value); void InitSet(SetOfVertices S, byte MaxValue); void AddSet(SetOfVertices S, byte Value); void SubSet(SetOfVertices S, byte Value); void MakeV_out(char *FileName, ArrayOfPointer V_out, byte *NumVertices, 199 http://www.ebook.edu.vn Boolean Weight); void MakeV_in(char *FileName, ArrayOfPointer V_in, ArrayOfPointer V_out, byte *NumVertices); void BuildGraph(char *FileName, ArrayOfEdge E, byte *NumVertices); void DisplayV_out(ArrayOfPointer V_out, byte NumVertices, Boolean Weight); void DisplayV_in(ArrayOfPointer V_in, byte NumVertices); void DFS(ArrayOfEdge E, byte Start, SetOfVertices S); void PathTwoVertex(Path Pred, byte Start, byte Terminal); void PopHeadPtr(byte NumVertices, ArrayOfPointer V_out); /***** Phan cai dat cac ham *****/ void Create(AdjPointer *List) { (*List) = NULL; } Boolean Empty(AdjPointer List) { return((List == NULL) ? TRUE : FALSE); } void Push(AdjPointer *List, byte Item) { AdjPointer TempPtr; TempPtr = (AdjPointer) malloc(sizeof(struct VertexNode)); TempPtr->Vertex = Item; TempPtr->Next = (*List); (*List) = TempPtr; } void Pop(AdjPointer *List, byte *Item) { AdjPointer TempPtr; if (Empty(*List)) { printf(" Thao tac con tro khong hop le "); return; 200 http://www.ebook.edu.vn } TempPtr = (*List); (*Item) = TempPtr->Vertex; (*List) = TempPtr->Next; free(TempPtr); } void CreatQueue(Queue *Q) { (*Q).Head = NULL; } Boolean EmptyQueue(Queue Q) { return((Q.Head == NULL) ? TRUE : FALSE); } void PushQueue(Queue *Q, byte Item) { QueueNode TempPtr; TempPtr = (QueueNode) malloc(sizeof(struct QueueType)); TempPtr->Vertex = Item; TempPtr->Next = NULL; if ((*Q).Head == NULL) (*Q).Head = TempPtr; else (*Q).Tail->Next = TempPtr; (*Q).Tail = TempPtr; } void PopQueue(Queue *Q, byte *Item) { QueueNode TempPtr; if (EmptyQueue(*Q)) { printf(" Thao tac con tro khong hop le "); return; } TempPtr = (*Q).Head; (*Item) = TempPtr->Vertex; (*Q).Head = TempPtr->Next; free(TempPtr); 201 http://www.ebook.edu.vn } Boolean EmptySet(SetOfVertices S) { int i, k = (MAXVERTICES %8 ) ? ((MAXVERTICES / 8) + 1) : (MAXVERTICES / 8); for (i = 0; i < k; i++) if (S[i] != 0) return(FALSE); return(TRUE); } Boolean InSet(SetOfVertices S, byte Value) { if ((Value < 1) || (Value > MAXVERTICES)) return(FALSE); return((S[(Value - 1) / 8] & (0x80 >> ((Value - 1) % 8))) ? TRUE : FALSE); } void InitSet(SetOfVertices S, byte MaxValue) { int i; if (MaxValue>MAXVERTICES) { printf(" Gia tri khong thuoc tap hop "); return; } for (i = 0; i < MaxValue; i++) S[i/8] |= 0x80 >> (i%8); } void AddSet(SetOfVertices S, byte Value) { int i; if ((Value < 1) || (Value > MAXVERTICES)) { printf(" Gia tri khong thuoc tap hop "); return; } 202 http://www.ebook.edu.vn S[(Value-1)/8] |= 0x80 >> ((Value-1)%8); } void SubSet(SetOfVertices S, byte Value) { if ((Value < 1) || (Value > MAXVERTICES)) { printf(" Gia tri khong thuoc tap hop "); return; } S[(Value-1)/8] &= ~(0x80 >> ((Value-1)%8)); } int feoln(FILE *fp) { char c; if ((c=fgetc(fp))==10) { fseek(fp, -2, 1); return(TRUE); } else if (c==EOF) return(TRUE); else { fseek(fp, -1, 1); return(FALSE); } } void freadln(FILE *fp) { char c; while (((c=fgetc(fp))!=10)&&(c!=EOF)); } void MakeV_out(char *FileName, ArrayOfPointer V_out, byte *NumVertices, Boolean Weight) { 203 http://www.ebook.edu.vn byte NumVert; HeadPointer HeadPtr; AdjPointer VerPtr; FILE *FileData; if ((FileData = fopen(FileName, "rt")) == NULL) { printf(" File khong tim thay "); return; } NumVert = 0; while (!feof(FileData)) { HeadPtr = (HeadPointer) malloc(sizeof(HeadNode)); HeadPtr->Next = NULL; fgets(HeadPtr->Data, MAXSTRINGS+1, FileData); // Ham fgets(char *s, int n, FILE *fp) chi doc n-1 ky tu while (!feoln(FileData)) { VerPtr = (AdjPointer) malloc(sizeof(struct VertexNode)); fscanf(FileData, "%d", &(VerPtr->Vertex)); if (Weight) { fscanf(FileData, "%d", &(VerPtr->Length)); VerPtr->Flow = 0; } VerPtr->Next = HeadPtr->Next; HeadPtr->Next = VerPtr; } freadln(FileData); ++NumVert; V_out[NumVert] = HeadPtr; } (*NumVertices) = NumVert; fclose(FileData); } void MakeV_in(char *FileName, ArrayOfPointer V_in, ArrayOfPointer V_out, byte *NumVertices); { byte NumVert; 204 http://www.ebook.edu.vn int i, j; HeadPointer HeadPtr; AdjPointer CurrPtr, VerPtr; MakeV_out(FileName, V_out, &NumVert, TRUE); (*NumVertices) = NumVert; for (i=1; i<=NumVert; i++) { HeadPtr = (HeadPointer) malloc(sizeof(HeadNode)); strcpy(HeadPtr->Data, V_out[i]->Data); HeadPtr->Next = NULL; for (j=1; j<=NumVert; j++) { CurrPtr = V_out[j]->Next; while (CurrPtr!=NULL) { if (CurrPtr->Vertex==i) { VerPtr=(AdjPointer)malloc(sizeof(struct VertexNode)); VerPtr->Vertex = j; VerPtr->Length = CurrPtr->Length; VerPtr->Flow = 0; VerPtr->Next = HeadPtr->Next; HeadPtr->Next = VerPtr; } CurrPtr = CurrPtr->Next; } } V_in[i] = HeadPtr; } } void BuildGraph(char *FileName, ArrayOfEdge E, byte *NumVertices) { byte EndPt, NumVert; int i; char ch[2]; EdgePointer EdgePtr; FILE *FileData; if ((FileData = fopen(FileName, "rt")) == NULL) { 205 http://www.ebook.edu.vn printf(" File khong tim thay "); return; } NumVert = 0; while (!feoln(FileData)) { ++NumVert; E[NumVert] = (ListEdgePointer) malloc(sizeof(ListEdge)); fscanf(FileData, "%s", ch); E[NumVert]->Data = ch[0]; E[NumVert]->Next = NULL; } (*NumVertices) = NumVert; for (i=1; i<=NumVert; i++) printf("%c ", E[i]->Data); printf("\n"); freadln(FileData); while (!feof(FileData)) { EdgePtr = (EdgePointer) malloc(sizeof(struct EdgeNode)); for (i=0; i<2; i++) { fscanf(FileData, "%d", &EndPt); printf("%d ", EndPt); EdgePtr->Vertex[i] = EndPt; EdgePtr->Link[i] = E[EndPt]->Next; E[EndPt]->Next = EdgePtr; } printf("\n"); freadln(FileData); } fclose(FileData); } void DFS(ArrayOfEdge E, byte Start, SetOfVertices Unvisited) { EdgePointer Ptr; byte StartEnd, OtherEnd, NewStart; SubSet(Unvisited, Start); 206 [...]... V_out[i ]-> Data); CurrPtr = V_out[i ]-> Next; while (CurrPtr!=NULL) { printf("%d ", CurrPtr->Vertex); if (Weight) printf("%d ", CurrPtr->Length); CurrPtr = CurrPtr->Next; } printf("\n"); } printf("\n"); } void DisplayV_in(ArrayOfPointer V_in, byte NumVertices) { int i; AdjPointer CurrPtr; for (i=1; i Data); CurrPtr = V_in[i ]-> Next;... %d", CurrPtr->Vertex, CurrPtr->Length); CurrPtr = CurrPtr->Next; } printf("\n"); } } void PathTwoVertex(Path Pred, byte Start, byte Terminal) { if (Terminal != Start) { PathTwoVertex(Pred, Start, Pred[Terminal]); printf(" -> %2d", Terminal); } } void PopHeadPtr(byte NumVertices, ArrayOfPointer V_out) { byte Item; int i; AdjPointer CurrPtr; for (i=1; i Next; while...Ptr = E[Start ]-> Next; while ((!EmptySet(Unvisited))&&(Ptr!=NULL)) { StartEnd = 0; OtherEnd = 1; if (Ptr->Vertex[0]!=Start) { StartEnd = 1; OtherEnd = 0; } NewStart = Ptr->Vertex[OtherEnd]; if (InSet(Unvisited, NewStart)) DFS(E, NewStart, Unvisited); Ptr = Ptr->Link[StartEnd]; } } void DisplayV_out(ArrayOfPointer V_out, byte NumVertices,... graphs with constraints on degrees, Studia Sci Math Hung 4 47 3-4 75 (1969) [8] Bondy J A., Chvatal V., A method in graph theory, Discrete Math 15, 11 1-1 35 (1976) [9] Brooks R L., On coloring the nodes of a network, Proc Cambridge Phil Soc., Vol 37, 19 4-1 97 (1941) [10] Busacker R G., Gowen P J., A procedure for determining a family of minimal-cost network flow patterns, Operations Research Office, Technical... o o Inst Kozl 7 25 5-2 26 (1962) [52] Shirey R W., Implementation and analysis of efficient graph planarity testing algorithms, Ph.D Dissertation, Computer Sciences, University of Wisconsin, Madison, Wisc (1969) [53] Tarjan R., Depth-first search and linear graph algorithms, SIAM J Computer 1 14 6-1 60 (1972) [54] Tutte W T., How to draw graph, Proc London Math Soc., Ser 3, Vol 13, 74 3-7 68 (1963) [55] Whitney... geometriam situs pertinentis, Commun Acad Sci Imp Petropol 8, Opera Omnia (1), Vol 7, 12 8-1 40 (1736) [23] Euler L., Commentationes Arithmeticae collectae, St Petersburg, (1766) [24] Fary I., On straight line representation of planar graphs, Acta Sci Math Szeged, Vol 11, 22 9-2 93 (1948) [25] Floyd R W., Algorithm 97-Shortest path, Comm of ACM, 5, 345 (1962) [26] Ford L R Jr., Network flow theory, Rand Corporation... Economics, Report LSE-TNT-22 (1965) [47] Ore O., Note on Hamilton circuits, Amer Math Mothly, 67, 55 (1960) [48] Ore O., The four colour problem, Academic Press, New York (1967) [49] Prim R C., Shortest connection networks and some generalizations, Bell Syst Tech Jl., 36, 1389 (1957) [50] Paton K., An algorithm for finding a fundamental set of cycles of a graph, Comm ACM, Vol 12, No 9, Sept., 51 4-5 18 (1969)... 208 http://www.ebook.edu.vn ˙ ’ T`i liˆu tham kha o a e [1] Appel K., The proof of the four-colour problem, New Scientist 72, 15 4-1 55 (1976) [2] Arlinghaus S., Arlinghaus W., Nystuen J., The Hedetniemi matrix sum: an algorithm for shortest path and shortest distance, Geographical Analysis, Vol 22, No 4, Oct., 35 1-3 60 (1990) [3] Bellman R., On a routing problem, Quart of Applied Mathematics, 16, 87 (1958)... Isomorphism of planar graphs, in Complexity of Computer Computations, Plenum, New York (1972) [34] Hopcroft J E., Tarjan R E., Efficient planarity testing, J ACM 21, 54 9-5 68 (1974) [35] Hu T C., Integer programming and network flows, Addison-Wesley, Reading, Massachusetts (1969) [36] Kerchenbaum A., Van Slyke R., Computing minimum spanning trees efficiently, Proc of the Ann Conf of ACM, Boston, 518 (1972)... [41] Kevin V., Whitney M., Algorithm 422-Minimum spanning tree, Comm of ACM, 15, 273 (1972) [42] Las Vergnas M., Probl`mes de couplage et probl`mes hamiltoniens en th´orie des e e e graphes, Doctoral thesis, Univsit´ de Paris VI (1972) e ` ´ u u e [43] Larry N., Sanford L., Lˆp tr`nh nˆng cao bˇ ng Pascal v´.i c´c cˆ u tr´c d˜ liˆu, Scitec a ı a a o a a [44] Mei-Ko Kwan, Graphic programming using odd . malloc(sizeof(struct QueueType)); TempPtr->Vertex = Item; TempPtr->Next = NULL; if ((*Q).Head == NULL) (*Q).Head = TempPtr; else (*Q).Tail->Next = TempPtr; (*Q).Tail = TempPtr; } void PopQueue(Queue. VertexNode)); VerPtr->Vertex = j; VerPtr->Length = CurrPtr->Length; VerPtr->Flow = 0; VerPtr->Next = HeadPtr->Next; HeadPtr->Next = VerPtr; } CurrPtr = CurrPtr->Next; } } V_in[i]. *Item) { QueueNode TempPtr; if (EmptyQueue(*Q)) { printf(" Thao tac con tro khong hop le "); return; } TempPtr = (*Q).Head; (*Item) = TempPtr->Vertex; (*Q).Head = TempPtr->Next; free(TempPtr); 201 http://www.ebook.edu.vn } Boolean