【算法】设计算法求所有强连通分量的完整代码(kosaraju算法)
生活随笔
收集整理的這篇文章主要介紹了
【算法】设计算法求所有强连通分量的完整代码(kosaraju算法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼:
typedef struct anode {int adjvex;//該邊的鄰接點編號struct anode* nexarc;//指向下一條邊的指針int weight;//該邊的相關信息,比如權值 }arcnode;//邊結點類型 typedef struct vnode {//InfoTyoe info; 頂點的其他信息arcnode* firstarc;//指向第一個邊結點 }Vnode;//鄰接表頭結點類型 typedef struct {vnode adjlist[10000];//鄰接表頭結點數組int n, e;//圖中頂點數n和邊數e }adjgraph;//完整的圖鄰接表類型 #define INF 1e6; #define maxn 1000; int visited[maxn]; stack<int>st;//全局棧,存放逆拓撲序列 void create(adjgraph*g,int A[8][8],int n,int e) {g->e = e;g->n = n;arcnode*q;for(int i = 0;i < n;i++)for(int j = 0;j < n;j++){if(A[i][j] != INF && i != j){g->adjlist[i].firstarc->weight = A[i][j]; q = (arcnode*)malloc(sizeof(arcnode)); q->adjvex = j; q->nexarc = g->adjlist[i].firstarc;//頭插法 g->adjlist[i].firstarc = q;}} } void createReAdj(adjgraph*g,adjgraph*g2){//產生逆鄰接表arcnode*q,*p;int i,w;g2 = (adjgraph*)malloc(sizeof(adjgraph));g2->n = g->n;for(int i = 0;i < g->n;i++)g2->adjlist[i].firstarc = NULL;for(int i = 0;i < g->n;i++){p = g->adjlist[i].firstarc;while (p != NULL){w = p->adjvex;//如果原圖存在(i,w)q = (arcnode*)malloc(sizeof(arcnode));q->adjvex = i;q->weight = p->weight;q->nexarc = g2->adjlist[w].firstarc;g2->adjlist[w].firstarc = q;//生成一條(w,i)邊p = p->nexarc;}} } //深度遞歸1 產生一個逆拓撲序列 void dfs1(adjgraph*g, int u) {visited[u] = 1;//從u出發深度搜索arcnode* q;q = g->adjlist[u].firstarc;//指向u的第一個鄰接點while(q){int num = q->adjvex;if(visited[num]!=1)dfs1(g,num);q = q->nexarc;//指向下一個鄰接點}st.push(u);//最后一步才將u入棧} //深度遞歸2 用于求一個強連通分量 ,其中一個數組component即一個強連通分量 void dfs2(adjgraph* g,int v,vector<int>&component) {int w;arcnode*p;visited[v] = 1;p = g->adjlist[v].firstarc;component.push_back(num);st.pop();//每次遞歸都出棧中的一個元素,直到最后棧為空while(p){int num = p->adjvex;if(!visited[num]){dfs2(g,num,component);}p = p->nexarc;} } void Kosaraju(adjgraph*g) {//求g的強連通分量adjgraph*g1;vector<int>com;memset(visited,0,sizof(visited));for(int i = 0;i < g->n;i++)if(st.size() != g->n)//當st中元素個數小于頂點數目時dfs1(g,i);//第一步首先遞歸產生逆拓撲序列memset(visited,0,sizeof(visited));//再次恢復visited為未訪問createReAdj(g,g1);//產生逆鄰接表while(!st.empty()){//棧不空時循環int top1 = st.top();//取棧頂com.clear();//每次都清空vector數組print("頂點%d的強連通分量",top1);dfs2(g,top,com);for(int i = 0;i < com.size();i++)cout<<com[i]<<" ";//輸出一個強連通分量cout<<endl;}detroy(g1);//銷毀g1 } 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【算法】设计算法求所有强连通分量的完整代码(kosaraju算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【过程记录 】windows和ubunt
- 下一篇: 【学习笔记】juc并发学习+关于锁的面试