日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【算法】设计算法求所有强连通分量的完整代码(kosaraju算法)

發布時間:2024/9/30 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法】设计算法求所有强连通分量的完整代码(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算法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。