如何驗證圖的連通性?


如何驗證圖的連通性?

<code>#include<iostream>
#include<queue>
#include <stdio.h>

using namespace std;
#define MAX_VNUM 10

typedef struct
{
\tint weight;
}Adj,AdjMatrix[MAX_VNUM][MAX_VNUM];

typedef struct
{
\tAdjMatrix adjM;
\tint vNum;
}adjGraph;

//創建一個圖,節點從0開始,注意傳入引用
void CreateGraph(adjGraph &G)
{
\tcout<\tcin>>G.vNum;
\tcout<\tfor (int i=0;i<g.vnum>\t{
\t\tfor (int j=0;j<g.vnum>{
\t\t\tcin>>G.adjM[i][j].weight;
\t\t}
\t}
}

//輸出一個圖
void print(adjGraph G)
{
\tfor(int i=0;i<g.vnum>\t{
\t\tfor(int j=0;j<g.vnum>\t\t{
\t\t\tcout<<g.adjm>\t\t}
\t\tcout<<endl>\t}
}


//warshall算法判斷圖的連通性
bool connectivityWarshall(adjGraph G)
{
\tadjGraph temp;//臨時判斷矩陣
\ttemp.vNum = G.vNum;

\t//初始化臨時判斷矩陣
\tfor (int i =0;i<temp.vnum>\t{
\t\tfor(int j=0;j<temp.vnum>\t\t{
\t\t\tif (G.adjM[i][j].weight)
\t\t\t\ttemp.adjM[i][j].weight = 1;
\t\t\telse
\t\t\t\ttemp.adjM[i][j].weight = 0;
\t\t}
\t\ttemp.adjM[i][i].weight = 1;
\t}

//矩陣乘法算法Warshall,R(a)
for (int a =0;a<temp.vnum>{
\tfor (int b=0;b<temp.vnum>\t{
\t\tif(temp.adjM[a][b].weight)
\t\t{
\t\t\tfor (int c = 0;c<temp.vnum>\t\t\t{
\t\t\t\tif (temp.adjM[c][a].weight)
\t\t\t\t\ttemp.adjM[c][b].weight = 1;
\t\t\t}
\t\t}
\t}
}

\t//進行判斷
for (int i=0;i<temp.vnum>{
\t\tfor (int j=0;j<temp.vnum>\t\t{
\t\t\tif (!temp.adjM[i][j].weight)
\t\t\t\treturn false;
\t\t}
\t}
\treturn true;
}


//廣度優先搜索判斷連通性
bool connectivityBFS(adjGraph G)
{
\tqueue q; //明白隊列用途?
\tbool visit[MAX_VNUM]; //訪問數組
\tint count = 0;
\tmemset(visit,0,sizeof(visit));
\tq.push(0); //0節點入隊列

\twhile(!q.empty())
\t{
\t\tint v = q.front();
\t\tvisit[v] = true;
\t\tq.pop();
\t\tcount++;

\t\t//與聯通且沒有被訪問過節點入隊列
\t\tfor (int i =0;i<g.vnum>{
\t\t\tif (G.adjM[v][i].weight)
\t\t\t{
\t\t\t\tif(!visit[i])
\t\t\t\t{
\t\t\t\t\tq.push(i);
\t\t\t\t}
\t\t\t}
\t\t}
\t}

\tif (count == G.vNum)
return true;
\telse
return false;
}

//深度優先搜索判斷圖的連通性,傳遞數組會改變值,visit需初始化
void dfs_visit(adjGraph G,int firstNode,bool visit[])
{
\tvisit[firstNode] = 1;
\tfor(int i=0; i<g.vnum>\t{
\t\tif(G.adjM[firstNode][i].weight & !visit[i])
\t\tdfs_visit(G,i,visit);
\t}
}

bool connectivityDFS(adjGraph G)
{
\tbool visit[MAX_VNUM]; //訪問數組
\tmemset(visit,0,sizeof(visit));
\tdfs_visit(G,0,visit); //從0節點開始訪問

for(int i=0;i<g.vnum>\t{
\t\tif (visit[i] == false) return false;
\t}
\treturn true;
}

int main()
{
\tadjGraph G;
\tCreateGraph(G);
\t//print(G);

\tif (connectivityWarshall(G)) cout<\telse cout<\tsystem("pause");
\treturn 0;
}/<g.vnum>/<g.vnum>/<g.vnum>
/<temp.vnum>/<temp.vnum>/<temp.vnum>/<temp.vnum>/<temp.vnum>/<temp.vnum>/<temp.vnum>/<endl>/<g.adjm>/<g.vnum>/<g.vnum>/<g.vnum>/<g.vnum>/<stdio.h>/<queue>/<iostream>/<code>


分享到:


相關文章: