圖的基本操作(無向帶權圖鄰接矩陣)
阿新 • • 發佈:2019-01-09
程式碼任意輸入數字進行測試,注意點從1開始輸入
#include<iostream> #include<queue> #include<cstdlib> using namespace std; #define inf 99999 #define maxsize 10 queue<int> seq; int edge[maxsize][maxsize]; int nv,ne; int visited[maxsize]; int init()//初始化 { for(int i=1;i<=nv;i++) for(int j=1;j<=nv;j++) if(i==j) edge[i][j]=0; else edge[i][j]=inf; }; void tozero() { memset(visited,0,sizeof(visited)); } int creat()//建圖 { init(); int a,b,weigh; for(int i=1;i<=ne;i++) { cin>>a>>b>>weigh; edge[a][b]=edge[b][a]=weigh; } } void DFS(int t,int ope)//深度優先搜尋 ope控制是否列印剛搜到的點,1是列印 { if(!visited[t]) { if(ope) cout<<t<<" "; visited[t]=1; for(int i=1;i<=nv;i++) if(edge[t][i]!=inf) DFS(i,ope); } } void BFS(int t)//廣度優先搜尋 { int tmp; seq.push(t); visited[t]=1; while(!seq.empty()) { tmp=seq.front(); cout<<tmp<<" "; seq.pop(); for(int i=1;i<=nv;i++) if(edge[tmp][i]!=inf&&!visited[i]) { seq.push(i); visited[i]=1; } } cout<<endl; } bool islink()//檢查圖是否連通 { if(nv-1>ne) return false; tozero(); DFS(1,0); for(int i=1;i<=nv;i++) if(!visited[i]) return false; return true; } bool istree()//檢出圖是否為樹 { return (nv==ne+1)&&islink(); } bool havepath(int a,int b)//檢查兩點之間是否有路徑 { tozero(); DFS(a,0); return visited[b]; } int main() { cin>>nv>>ne; creat(); tozero(); DFS(1,1); tozero(); cout<<endl; BFS(1); cout<<islink()<<endl; cout<<istree()<<endl; return 0; }