#include #include #include using namespace std;
typedef struct link_graphiclink_graphic,*plink_graphic;
typedef struct queuequeue;
void init(queue *&queue)//佇列初始化
void enqueue(queue *& queue,int value)//入佇列操作
else
}void dequeue(queue *&queue)//出佇列操作
}void add_vertex(plink_graphic &plg,plink_graphic plgtmp)//新增結點
void delete_redundance(plink_graphic *&plg,int n)//刪除冗餘邊和自迴圈邊
else
} }delete visited;
}void dfs_visit(plink_graphic *&plg,int value,int *visited)//深度優先遍歷,建立有向無環圖
else if(visited[plgtmp->value]==1)
pltpre->next=plt->next;
plgtmp=plt->next;//指向下乙個結點
delete plt;//刪除該結點
}else
} visited[value]=2;//將當前邊標記為已經訪問結束
}void directed_acyclic_graphs(plink_graphic *&plg,int n)//有向無環圖
plgtmp=plgtmp->next;
} depth=depth+1;
dist[value]=depth;//更新距離值
}void topologic_depth_first_search(plink_graphic *&plg,int *dist,int n)//深度優先搜尋,並返回距離最大的結點的下標索引值,拓撲排序 }}
void topological_sort(plink_graphic *& plg,int *dist,int n)//拓撲排序
plgtmp=plgtmp->next;
}} }
return count;
}int out_degree(plink_graphic *&plg,int value,int n)//出度
return count;
}bool vertify_isolated(plink_graphic *&plg,int value,int n)//檢查是否有孤立的點
void break_isolated(plink_graphic *&plg,int n)//打破孤立的點
else
} }}void topologic_sort_iterator(plink_graphic *&plg,int n)//另一種,迭代方式的拓撲排序
plt=plt->next;
} coutvalue<
dequeue(queue);// 彈出佇列首元素
} for(int i=0;inext;
while (plgt) }}
void strongly_connected_components(plink_graphic *&plg,int n)//強連通分量
link_graphic_transpose(plg,plgtranspose,n);//轉置
int *dec=new int[2*n+1];//深度優先遍歷的時間陣列會使用2*n+1個空間來儲存
for(int i=0;i<2*n+1;i++)
for(int i=0;i=0;--i)
cout<
} }cout
plg[i]->next=null;
for(int j=0;jvalue=rand()%n;
plgtmp->next=null;
add_vertex(plg[i],plgtmp);//新增結點
} }cout<
plgtmp=plgtmp->next;
} cout
plgtmp=plgtmp->next;
} cout
plgtmp=plgtmp->next;
} cout
plgtmp=plgtmp->next;
} cout<
}*/cout<
int *dist=new int[n];
topological_sort(plg,dist,n);
delete dist;
cout<
cout<
topologic_sort_iterator(plg,n);
cout<
strongly_connected_components(plg,n);//強連通分量
強連通分量 tarjan求強連通分量
雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...
強連通分量
對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...
強連通分量
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...