Main.h: #include <iostream> #include <queue> #define DefaultSize 10#define maxweight-1using namespace std; Template<typename t,typename e>struct edge{int dest; E cost; Edge<t,e> *link; Edge (int d=0,int c=0):d EST (d), cost (c), link (NULL) {}};template<typename t,typename e>struct vertex{t data; Edge<t,e> *adj;}; Template<typename t,typename e>class base{public:virtual T getValue (int i) =0;virtual E getweight (int v1,int v2) = 0; virtual bool Insertvertex (const t& vertex) =0;virtual bool Insertedge (const t& l,const t& r,e cost) =0;virtual V OID Show () =0;virtual bool Removeedge (int v1,int v2) =0;virtual bool Removevertex (int v) =0;virtual int Getfirstneighbor ( int v) =0;virtual int numberofedge () =0;virtual int Getnextneighbor (int v,int W) = 0;}; Template<typename t,typename e>class graphlnk:public base<t,e>{public:graphlnk (int sz=DefaultSize) { numvertices=0;maxvertices=defaultsize;numegde=0; nodetable = new Vertex<t,e>[sz];for (int i=0;i<sz;i++){nodetable[i].adj=null;}} int Numberofedge () {return numegde;} int Getfirstneighbor (int v) {if (v<0| | v>=numvertices) return-1; edge<t,e> *p = nodetable[v].adj;if (p!=null) {return p->dest;} return-1;} int Getnextneighbor (int v,int w) {if (v<0 | | v>=numvertices | | w<0 | | w>=numvertices) {return-1;} edge<t,e> *p = Nodetable[v].adj;while (p!=null) {if (p->dest = W) {if (p->link!=null) return p->link-> Dest;} p = p->link;} return-1;} BOOL Removevertex (int v) {edge<t,e> *p = Nodetable[v].adj;while (p!=null) {Removeedge (v,p->dest);p =p->link ;} Nodetable[v].data = Nodetable[numvertices-1].data; Nodetable[v].adj = Nodetable[numvertices-1].adj;p = Nodetable[numvertices-1].adj; edge<t,e> *q = Null;while (p!=null) {int index = P->DEST;Q = Nodetable[index].adj;while (q!=null) {if (q->dest= = (numVertices-1)) {q->dest = V;break;} Q=q->link;} P=p->link;} numvertices--;} BOOL Removeedge (int v1,int v2) {if (v1<0| | v1>=numvertices| | v2<0| | V2>=numvertices) {return false;} edge<t,e> *p = Nodetable[v1].adj; edge<t,e> *q = null;while (p!=null && p->dest!=v2) {q=p;p=p->link;} if (q==null && p==null) {return false;} if (q==null && p!=null && p->dest==v2) {nodetable[v1].adj=p->link;delete p;} if (P==null) {return false;} else if (q!=null) {q->link=p->link;delete p;} p = nodetable[v2].adj;q = Null;while (p!=null && p->dest!=v1) {q=p;p=p->link;} if (q==null && p==null) {return false;} if (q==null && p!=null && p->dest==v1) {nodetable[v2].adj=p->link;delete p;} if (P==null) {return false;} else if (q!=null) {q->link=p->link;delete p;} numegde--;} BOOL Insertedge (const t& l,const t& r,e cost) {int v1 = Getvaluepos (l); int v2 = Getvaluepos (r); edge<t,e> *p = Nodetable[v1].adj; edge<t,e> *s = new edge<t,e> (v2,cost); edge<t,e> *q = null;while (p!=null && p->dest!=cost) {q=p;p=p->link;} if (p!=null && p->dest==cost) {return FAlse;} if (q==null) {Nodetable[v1].adj = s;} if (p==null && q!=null) {s->link = Nodetable[v1].adj; Nodetable[v1].adj=s;} p = nodetable[v2].adj;s = new edge<t,e> (v1,cost); q = null;while (p!=null && p->dest!=cost) {q=p;p=p-> Link;} if (p!=null && p->dest==cost) {return false;} if (q==null) {Nodetable[v2].adj = s;} if (p==null&&q!=null) {s->link = Nodetable[v2].adj; Nodetable[v2].adj=s;} numegde++;} BOOL Insertvertex (const t& vertex) {Nodetable[numvertices++].data=vertex;return true;} void Show () {edge<t,e> *p=null;for (int i=0;i<numvertices;i++) {cout<<nodetable[i].data<< ">" ;p =nodetable[i].adj;while (p!=null) {cout<<p->dest<< "--" <<p->cost<< "";p =p->link ;} Cout<<endl;}} E getweight (int v1,int v2) {if (v1<0 | | v1>=numvertices | | v2<0 | | v2>=numvertices) {return-1;} edge<t,e> *p = nodetable[v1].adj;//edge<t,e> *m = NULL; while (p!=null) {//m = P;if (p->dest==v2) break;p=p-≫link;} if (p!=null) {return p->cost;} Else{return maxweight;}} T getValue (int i) {returnnodetable[i].data;} int numberofvertices () {return numvertices;} int Getvaluepos (const T &t) {for (int i=0;i<numvertices;i++) {if (nodetable[i].data==t) return i;} return-1;} edge<t,e> * GETNODEPTR (int i) {return nodetable[i].adj;} Private:int numvertices;int Maxvertices;int Numegde; Vertex<t,e> *nodetable;}; Template<typename t,typename e>void DFS (graphlnk<t,e>& g,const t& v,bool visted[]) {int index = G.getvaluepos (v); Cout<<g.getvalue (index) <<endl;visted[index]=true;int w = G.getfirstneighbor (index); while (W!=-1) {if (!visted[w]) DFS (G,g.getvalue (w), visted); w = G.getnextneighbor (index,w);} /*while (index!=-1) {int x = 0;while (!visted[index]) {cout<<g.getvalue (index) <<endl;visted[index]=true;x = G.getfirstneighbor (Index);D FS (G,g.getvalue (x), visted);} index = G.getnextneighbor (X,index);} */}template<typename t,typename e>void DFS (graphlnk<t,e>& G,const t& v) {int n = g.numberofvertices (); bool *visted = new bool[n];for (int i=0;i<n;i++) {Visted[i] = false;} DFS (g,v,visted);} Template<typename t,typename e>void BFS (graphlnk<t,e>& g,const t& v) {int n = G.NumberOfVertices (); BOOL *visted = new bool[n];for (int i=0;i<n;i++) {Visted[i] = false;} int i = G.getvaluepos (v);queue<int> Q; Q.push (i); int index;while (! Q.empty ()) {index = Q.front (); Q.pop (), if (!visted[index]) {cout<<g.getvalue (index) <<endl;visted[index] = true;} int x = G.getfirstneighbor (index), while (X!=-1) {if (!visted[x]) {q.push (x);} x = G.getnextneighbor (index,x); }}}template<typename t,typename e>void Search (graphlnk<t,e> &g) {bool *visted = new bool[g. Numberofvertices ()];for (int i=0;i<g.numberofvertices (); i++) {if (!visted[i]) DFS (G,g.getvalue (i), visted);}}
Main.cpp:
#include <iostream> #include "main.h" using namespace Std;template<typename t>class minheap{public:minheap (int sz) {Maxsize = Sz;data = new T[sz]; numsize = 0;} void Insert (T x) {data[numsize++] = x;int n = numsize/2;while (n>=0) {Sort (data,n); n--;}} void Swap (t *a,t *b) {T temp = *a;*a = *b;*b = temp;} T Remove () {T temp = Data[0];int n=numsize; numsize=0;for (int i=1;i<n;i++) {Insert (data[i]);} return temp;} void Sort (T a[],int n) {int i = n; int j = 2*i+1;while (j<numsize) {if (j+1<numsize && a[j]>a[j+1]) j=j+1;if (j <numsize && A[i]>a[j]) Swap (&a[i],&a[j]); i = J;j = 2*i+1;}} void Show () {for (int i=0;i<numsize;i++) {cout<<data[i]<< "";} Cout<<endl;} Private:t *data;int maxsize;int numsize;}; Class Ufset{public:ufset (int sz) {parent = new int[sz];size = sz;for (int i=0;i<sz;i++) {parent[i]=-1;}} void Show () {for (int i=0;i<size;i++) {cout<<parent[i]<< ""; }cout<<endl;for (int j=0;j<size;j++) {cout<<j<< " ";} Cout<<endl;} void Union (int a,int b) {int x = find (a); int y = find (b); if (x!=y) {if (x>y) {parent[x]+=parent[y];p arent[y]=x;} ELSE{PARENT[Y]+=PARENT[X];p arent[x]=y;}}} int Find (int x) {while (parent[x]>0) X=parent[x];return x;} Private:int *parent;int size;}; #define DEFAULT-1CONST Float maxValue = default;template<typename t,typename e>struct mstedgenode{int tail,head; E key; Mstedgenode (): Tail ( -1), Head ( -1), key (0) {}bool operator > (const mstedgenode<t,e> &mst) {return key> Mst.key;} BOOL operator < (const mstedgenode<t,e> &mst) {return key<mst.key;} mstedgenode& operator = (const mstedgenode& MST) {tail = Mst.tail;head = Mst.head;key = Mst.key;return *this;}}; Template<typename t,typename e>class minspantree{protected:mstedgenode<t,e> *edgevalue;int MaxSize,n; Public:minspantree (int sz=default-1): MaxSize (SZ), N (0) {edgevalue = new Mstedgenode<t,e>[sz];} int Insert (mstedgenode<t,e>& item) {Edgevalue[n++]=item;} void Show () {for (int i=0;i<n;i++) {cout<<edgevalue[i].tail<< ":" <<edgevalue[i].head<< ":" << edgevalue[i].key<< "";cout<<endl;}}}; Template<typename t,typename e>void Kruskal (graphlnk<t,e>& g,minspantree<t,e> &MST) { Mstedgenode<t,e> Ed;int U,v,count; int n = g.numberofvertices (); int m = G.numberofedge (); Minheap<mstedgenode<t,e> >h (m); Ufset F (n); for (U = 0;u<n;u++) {for (v = u+1;v<n;v++) {if (G.getweight (u,v)!=maxvalue) {ed.tail = U;ed.head = V;ed.key = G.getweight (U,V); H.insert (ed);//h.show ();}} Count=1;while (count<m) {ed = H.remove (); u = F.find (ed.tail); v = f.find (ed.head); if (U = v) {f.union (u,v); Mst. Insert (ed);} count++;}} int main () {minspantree<char,int> MST (10); Graphlnk<char,int> Gh;gh.insertvertex (' A '); Gh.insertvertex (' B '); Gh.insertvertex (' C '); Gh.insertvertex (' D ') ; Gh.insertvertex (' E '); Gh.insertvertex (' F '); Gh.insertvertex (' G '); Gh.insertedge (' A ', ' B ', '); Gh.insertedge (' B ', ' C ', +); Gh.insertedge ('C ', ' d ', ' N ', Gh.insertedge (' d ', ' e ', '), Gh.insertedge (' e ', ' f ', '), Gh.insertedge (' f ', ' A ', ten); Gh.insertedge (' B ', ' G ') , Gh.insertedge (' D ', ' g ', '), Gh.insertedge (' E ', ' G ', "), GH. Show ();cout<< "-------------------" <<endl; Kruskal (GH,MST); MST. Show (); return 0;}
adjacency Table of graphs (breadth-first traversal, depth-first traversal, minimum spanning tree (Kruskal algorithm))