有向图的强连通分量有向图的强连通分量
#include
#include
using namespace std;
#define MAX_VERTEX_NUM 20
typedef struct ArcBox{
int tailvex,headvex; //该弧的尾和头顶点的位置
struct ArcBox *hlink,*tlink; //分别为弧头相同和弧尾相同的弧的链域
// InfoType *info; //该弧相关信息的指针 }ArcBox;
typedef struct VexNode{
int data; ...
有向图的强连通分量
#include
#include
using namespace std;
#define MAX_VERTEX_NUM 20
typedef struct ArcBox{
int tailvex,headvex; //该弧的尾和头顶点的位置
struct ArcBox *hlink,*tlink; //分别为弧头相同和弧尾相同的弧的链域
// InfoType *info; //该弧相关信息的指针 }ArcBox;
typedef struct VexNode{
int data;
ArcBox *firstin,*firstout; //分别指向该顶点第一条入弧和出弧 }VexNode;
typedef struct{
VexNode xlist[MAX_VERTEX_NUM]; //头向量
int vexnum,arcnum; //有向图的当前顶点数和弧数 }OLGraph;
int CreateDG(OLGraph& G){
cout<<"请输入顶点个数和弧数:";
cin>>G.vexnum>>G.arcnum;
int i=0;
for( i=0; i>v1>>v2;
ArcBox *current=G.xlist[v1-1].firstout;
ArcBox *p=G.xlist[v1-1].firstout;
if(current==NULL){
G.xlist[v1-1].firstout=new ArcBox;
G.xlist[v1-1].firstout->headvex=v1-1;
G.xlist[v1-1].firstout->tailvex=v2-1;
G.xlist[v1-1].firstout->hlink=G.xlist[v1-1].firstout->tlink=NULL;
p=G.xlist[v1-1].firstout;
}
else{
p=current;
while(current!=NULL){
p=current;
current=current->tlink;
}
current=new ArcBox;
current->headvex=v1-1;
current->tailvex=v2-1;
current->hlink=current->tlink=NULL;
p->tlink=current;
p=p->tlink;
}
current=G.xlist[v2-1].firstin;
if(current==NULL){
G.xlist[v2-1].firstin=p;
}
else{
while(current->hlink!=NULL){
current=current->hlink;
}
current->hlink=p;
}
}
return 1;
}
bool visited[MAX_VERTEX_NUM]={false}; bool unvisited[MAX_VERTEX_NUM]={false};
vector numberlist;
vector set;
int GetFirst(OLGraph& G,int i){
if(G.xlist[i].firstout==NULL)
return -1;
else{
return G.xlist[i].firstout->tailvex;
}
}
int GetNext(OLGraph& G,int i,int j){
ArcBox* pcurrent=G.xlist[i].firstout;
while(pcurrent!=NULL){
if(pcurrent->tailvex==j){
break;
}
pcurrent=pcurrent->tlink;
}
if(pcurrent!=NULL && pcurrent->tlink!=NULL){
return pcurrent->tlink->tailvex;
}
return -1;
}
void DFS(OLGraph& G,int i){
visited[i]=true;
cout<=0; j=GetNext(G,i,j)){
if(!visited[j]){
DFS(G,j);
}
}
numberlist.push_back(i);
}
void DFSTraverse(OLGraph& G){
for(int i=0; iheadvex;
}
}
int GetNext1(OLGraph& G,int i,int j){
ArcBox* pcurrent=G.xlist[i].firstin;
while(pcurrent!=NULL){
if(pcurrent->headvex==j){
break;
}
pcurrent=pcurrent->hlink;
}
if(pcurrent!=NULL && pcurrent->hlink!=NULL){
return pcurrent->hlink->headvex;
}
return -1;
}
void DFS1(OLGraph& G,int i){
set.push_back(i+1);
unvisited[i]=true;
for(int j=GetFirst1(G,i); j>=0; j=GetNext1(G,i,j)){
if(!unvisited[j]){
DFS1(G,j);
}
}
}
void DFSTraverse1(OLGraph& G){
int k;
for(int i=numberlist.size()-1; i>=0; i--){
int j=numberlist[i];
if(!unvisited[j]){
if(!set.empty()){
cout<<"连通分量为:"<tailvex<<" ";
current=current->tlink;
}
}
cout<tlink;
delete p;
p=q;
}
}
}
return 1;
}
本文档为【有向图的强连通分量】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。