adjacency Table of graphs (breadth-first traversal, depth-first traversal, minimum spanning tree (Kruskal algorithm))

Source: Internet
Author: User

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-&GT;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-&Gt;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))

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.