大连理工大学软件学院数据结构第四章第九题
生活随笔
收集整理的這篇文章主要介紹了
大连理工大学软件学院数据结构第四章第九题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*思想:利用拓撲排序來找圖中的環,即離散數學中的w過程,每次找到一條入度為零的邊將其以及其所關聯的邊刪除,直到刪除到環的時候再也進行不下去,此時將環中的任意一個元素開始深度優先遍歷即可。
*/#include <iostream>
#include <queue>
using namespace std;template<class EdgeType>
class Edge
{
public:int start,end;//邊的起始節點,終止節點EdgeType weight;//邊的權重(應該可以定義為int)Edge(){start=0;end=0;weight=0;}Edge(int st,int en,int w){start=st;end=en;weight=w;}bool operator > (Edge oneEdge){if(weight>oneEdge.weight)return true;elsereturn false;}bool operator < (Edge oneEdge){if(weight<oneEdge.weight)return true;elsereturn false;}
};template<class EdgeType>
class Graph
{public:int vertexNum; //圖中節點個數int edgeNum; //圖中邊的個數int * Mark; //標記某節點是否被訪問Graph(int verNum){this->vertexNum=verNum;edgeNum=0;Mark=new int[vertexNum];for(int i=0;i<vertexNum;i++){Mark[i]=0; //都沒有被訪問過}}~Graph(){delete [] Mark;}//virtual Edge<EdgeType> FirstEdge(int oneVertex)=0;//virtual Edge<EdgeType> NextEdge(Edge<EdgeType> oneEdge)=0;int verticesNum(){return vertexNum;}int EdgesNum(){return edgeNum;}bool isEdge(Edge<EdgeType> oneEdge){if(oneEdge.end>=0 && oneEdge.start>=0 && oneEdge.weight>0 && oneEdge.start!=oneEdge.end)//判斷條件還不清楚{return true;}else{return false;}}int startOfVertex(Edge<EdgeType> oneEdge){return oneEdge.start;}int endOfVertex(Edge<EdgeType> oneEdge){return oneEdge.end;}EdgeType weight(Edge<EdgeType> oneEdge) //返回oneEdge的權重{return oneEdge.weight;}//virtual void setEdge(int start,int end,int weight)=0;//virtual void deleteEdge(int start,int end)=0;
};template<class EdgeType>
class AdjGraph : public Graph<EdgeType >
{private:int ** matrix;public:AdjGraph(int verNum):Graph<EdgeType>(verNum){matrix =new int * [verNum];for(int i=0;i<verNum;i++){matrix[i]=new int [verNum];}for(int i=0;i<verNum;i++)for(int j=0;j<verNum;j++){matrix[i][j]=999;}}AdjGraph(int verNum,int ** a):Graph<EdgeType>(verNum){matrix =new int * [verNum];for(int i=0;i<verNum;i++){matrix[i]=new int [verNum];}for(int i=0;i<verNum;i++)for(int j=0;j<verNum;j++){matrix[i][j]=a[i][j];}}EdgeType getIJ(int i,int j){if(i<this->vertexNum && i>=0 && j<this->vertexNum && j>=0)return matrix[i][j];else{cout<<"鄰接矩陣越界"<<endl;return 0;}}int EdgesNum(){int edgeNum=0;for(int i=0;i<this->vertexNum;i++){for(int j=0;j<this->vertexNum;j++)if(matrix[i][j]<999)edgeNum++;}this->edgeNum=edgeNum;return edgeNum;}void disp(){cout<<endl;cout<<"此圖的領接矩陣為"<<endl;for(int i=0;i<this->vertexNum;i++){for(int j=0;j<this->vertexNum;j++){cout<<matrix[i][j]<<" ";}cout<<endl;}}~AdjGraph(){for(int i=0;i<this->vertexNum;i++){matrix[i]=new int [this->vertexNum];}delete [] matrix;}Edge<EdgeType> FirstEdge(int oneVer) //返回頂點的第一條邊{Edge<EdgeType> tem;tem.start=oneVer;for(int i=0;i<this->vertexNum;i++){if(matrix[oneVer][i]<999){tem.end=i;tem.weight=matrix[oneVer][i];return tem;//break;}}tem.weight=-1;tem.end=tem.start=0;//cout<<"沒有符合條件的邊"<<endl;return tem;}Edge<EdgeType> NextEdge(Edge<EdgeType> oneEdge)//返回與oneEdg有相同起點的下一條邊{Edge<EdgeType> tem;tem.start=oneEdge.start;for(int i=oneEdge.end+1;i<this->vertexNum;i++){if(matrix[oneEdge.start][i]<999){tem.end=i;tem.weight=matrix[oneEdge.start][i];return tem;}}tem.weight=-1;//cout<<"沒有符合條件的邊"<<endl;return tem;}void visit(int i){cout<<i<<" ";}//深度優先搜索void DFS(int i)//從i號節點開始深度優先搜索{this->Mark[i]=1;//cout<<"zhe次從這里開始深度遍歷"<<i<<endl;visit(i);for(Edge<EdgeType> e=FirstEdge(i);this->isEdge(e);e=NextEdge(e)){if(this->Mark[e.end]==0){//cout<<"下次從這里開始深度遍歷"<<e.end<<endl;DFS(e.end);}}}void DFSGraph()//對圖進行深度優先搜索{for(int i=0;i<this->vertexNum;i++)this->Mark[i]=0; //標記都未訪問for(int i=0;i<this->vertexNum;i++){if(this->Mark[i]==0){DFS(i);}}}//廣度優先搜索void BFS(int i)//從i號節點開始廣度優先搜索{queue<int> que;que.push(i);visit(i);this->Mark[i]=1;int p;while(!que.empty()){p=que.front();que.pop();this->Mark[p]=1;for(Edge<EdgeType> e=FirstEdge(p);this->isEdge(e);e=NextEdge(e)){if(this->Mark[e.end]==0){//此處要注意,在節點入隊時候就要將Mark置為已訪問,否則可能會導致同一節點多次入隊visit(e.end);this->Mark[e.end]=1;que.push(e.end);}}}}void BFSGraph()//對圖進行廣度優先搜索{for(int i=0;i<this->vertexNum;i++)this->Mark[i]=0; //標記都未訪問for(int i=0;i<this->vertexNum;i++){if(this->Mark[i]==0){BFS(i);}}cout<<endl;}};//拓撲排序,判斷圖中是否有環,并輸出一個環
template<class EdgeType>
void TopuSortJudeIsExitCricle(AdjGraph<EdgeType>& G,int * SortArray)//從S出發生成最短路徑
{int n=G.verticesNum();int * inderGree= new int [n];for(int i=0;i<n;i++){G.Mark[i]=0;inderGree[i]=0;SortArray[i]=-1;}for(int i=0;i<n;i++){for(Edge<EdgeType> e = G.FirstEdge(i);G.isEdge(e);e=G.NextEdge(e)){//cout<<"e的開頭"<<e.start<<endl;//cout<<"e的結尾"<<e.end<<endl;inderGree[e.end]++;}}cout<<"inder數組"<<endl;for(int j=0;j<n;j++){cout<<inderGree[j]<<" ";}cout<<endl;for(int i=0;i<n;i++){int v;for(v=0;v<n;v++){if(inderGree[v]==0 && G.Mark[v]==0){cout<<"入度為零的點為"<<v<<endl;break;}}if(v==n){cout<<"圖中存在環"<<endl;cout<<"此時的mark數組"<<endl;for(int j=0;j<n;j++){cout<<G.Mark[j]<<" ";}cout<<endl;for(int j=0;j<n;j++){if(G.Mark[j]==0){cout<<"環從這里開始"<<j<<endl;G.DFS(j);cout<<endl;return;}}}G.Mark[v]=1;SortArray[i]=v;for(Edge<EdgeType> e = G.FirstEdge(v);G.isEdge(e);e=G.NextEdge(e)){inderGree[e.end]--;}}delete [] inderGree;
}int main()
{//課本p170的圖int tem[6][6]={{999, 1, 1, 1, 1, 1},{999,999,1 ,999,999,999},{999,999,999,999,1 ,999},{999,999,1 ,999,999,999},{999,999,999,1 ,999,999},{999,999,999,999,1 ,999},};int n=6;int ** a=new int *[n];for(int i=0;i<n;i++){a[i]=new int [n];}for(int i=0;i<n;i++)for(int j=0;j<n;j++){a[i][j]=tem[i][j];}AdjGraph<int> p(n,a);p.disp();cout<<"深度優先搜索"<<endl;p.DFSGraph();cout<<endl;cout<<"廣度優先搜索"<<endl;p.BFSGraph();int sortArray[n];TopuSortJudeIsExitCricle(p,sortArray);cout<<"拓撲序列為"<<endl;for(int i=0;i<n;i++){if(sortArray[i]>0)cout<<sortArray[i]<<" ";}cout<<endl;return 0;
}
總結
以上是生活随笔為你收集整理的大连理工大学软件学院数据结构第四章第九题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软ERP Microsoft Dyna
- 下一篇: 评价猪八戒网金牌会员服务