判斷一個有向圖是否有環
採用深度優先遍歷
#include<iostream>
#include<malloc.h>
using namespace std;
#define maxNum 100 //定義鄰接舉證的最大定點數
int point=0;//pre和post的值
bool is_DAG=true;//標識位,表示有向無環圖
/*
頂點顏色表 color[u]
0 白色,未被訪問過的節點標白色
-1 灰色,已經被訪問過一次的節點標灰色
1 黑色,當該節點的所有後代都被訪問過標黑色
反向邊:
如果第一次訪問(u,v)時v為灰色,則(u,v)為反向邊。在對圖的深度優先搜尋中沒有發現
反向邊,則該圖沒有迴路
程式判斷依據:
仍然是按圖的節點深度遍歷,訪問到V時,V若被訪問過,那麼有2種狀態:
color[u]=-1,程式跳出,存在環
color[u]=1,程式繼續,這不是環
時間複雜度:O(n+e)
*/
int color[maxNum];//頂點顏色表 color[u]
//圖的鄰接矩陣表示結構
typedef struct
{
char v[maxNum];//圖的頂點資訊
int e[maxNum][maxNum];//圖的頂點資訊
int vNum;//頂點個數
int eNum;//邊的個數
}graph;
void createGraph(graph *g);//建立圖g
void DFS(graph *g);//深度優先遍歷圖g
void dfs(graph *g,int i);//從頂點i開始深度優先遍歷與其相鄰的點
void dfs(graph *g,int i)
{
//cout<<"頂點"<<g->v[i]<<"已經被訪問"<<endl;
cout<<"頂點"<<i<<"已經被訪問"<<endl;
color[i]=-1;
for(int j=1;j<=g->vNum;j++)
{
if(g->e[i][j]!=0)
{
if(color[j]==-1)//探索到回邊,存在環
{
is_DAG=false;//不是有向無環圖
}
else if(color[j]==0)
dfs(g,j);
}
}
color[i]=1;//表示i的後裔節點都被訪問過
}
void DFS(graph *g)
{
int i;
//初始化color陣列,表示一開始所有頂點都未被訪問過,//初始化pre和post
for(i=1;i<=g->vNum;i++)
{
color[i]=0;
}
//深度優先搜尋
for(i=1;i<=g->vNum;i++)
{
if(color[i]==0)//如果這個頂點為被訪問過,則從i頂點出發進行深度優先遍歷
{
dfs(g,i);
}
}
}
void createGraph(graph *g)//建立圖g
{
cout<<"正在建立無向圖..."<<endl;
cout<<"請輸入頂點個數vNum:";
cin>>g->vNum;
cout<<"請輸入邊的個數eNum:";
cin>>g->eNum;
int i,j;
//初始畫圖g
for(i=1;i<=g->vNum;i++)
for(j=1;j<=g->vNum;j++)
g->e[i][j]=0;
//輸入邊的情況
cout<<"請輸入邊的頭和尾"<<endl;
for(int k=1;k<=g->eNum;k++)
{
cin>>i>>j;
g->e[i][j]=1;
}
}
int main()
{
graph *g;
g=(graph*)malloc(sizeof(graph));
createGraph(g);//建立圖g
DFS(g);//深度優先遍歷
if(is_DAG)
cout<<"圖g是有向無環圖,沒有環"<<endl;
else
cout<<"圖g不是有向無環圖,存在環"<<endl;
int k;
cin>>k;
return 0;
}
相關文章
- 對一個連結串列判斷是否有環
- POJ3259 Wormholes【判斷是否有負環】Worm
- 如何判斷一項技術是否有前途?
- python如何判斷一列是否有資料Python
- js判斷物件裡面是否有某個屬性JS物件
- 演算法題:反轉一個單連結串列&判斷連結串列是否有環演算法
- 如何判斷連結串列中是否有環並找出環的入口位置
- 判斷一個物件是否為空物件,判斷一個物件中是否有空值物件
- 判斷欄位中是否有漢字
- HDU 1671 字典樹(判斷是否有一個串是另一個串的子串)。
- JavaScript 判斷物件中是否有某屬性JavaScript物件
- 如何判斷一個玩法是否合格?
- 如何判斷一個物件是否為空?物件
- 判斷一個陣列是否排好序陣列
- POJ1860 Currency Exchange【Bellman_ford演算法:判斷是否有正環】演算法
- 判斷字串是否唯一字串
- PHP 判斷一個字元是否在字串中PHP字元字串
- PHP判斷一個字串是否包含亂碼PHP字串
- 如何判斷一個元素文字是否換行?
- python如何判斷一個物件是否是列表Python物件
- 判斷是否為環形連結串列
- Python判斷海域有多少個小島Python
- dataset 判斷整列是否有重複,找出重複資料
- 模擬微任務 判斷是否有對應的apiAPI
- Python判斷變數是否是整數的方法有哪些?Python變數
- 有向圖的連通性(判強連通)
- 判斷Map集合中是否存在某一個key
- 判斷一個數是否為質數(程式碼)
- python如何判斷一個數是否是整數Python
- 如何判斷一個 interface{} 的值是否為 nil ?
- JS如何判斷一個陣列是否為空、是否含有某個值JS陣列
- 向HashSet插入自定義物件判斷是否重複物件
- 判斷是否遵守某個協議協議
- js判斷兩個物件是否相等JS物件
- nginx判斷路徑是否含有某個引數做判斷Nginx
- 判斷img圖片是否載入成功
- python如何判斷圖片是否為空Python
- 判斷是否有檔案並設定理性,上傳到cos