图的有关操作
1.键盘输入数据,建立一个有向图的邻接表。
2.输出该邻接表。
3.在有向图的邻接表的基础上计算各顶点的度,并输出。
4.以有向图的邻接表为基础实现输出它的拓扑排序序列。
5.采用邻接表存储实现无向图的深度优先非递归遍历。
6.采用邻接表存储实现无向图的广度优先遍历。
7.在主函数中设计一个简单的菜单,分别调试上述算法。
#include <iostream> #include <vector> #include <string.h> #include <queue> #include <stack> using namespace std; const int N=1000; struct tu1 { vector<int>tu[N]; int n,m; int rd[N],cd[N]; ///入度和出度 void input() { memset(rd,0,sizeof(rd)); memset(cd,0,sizeof(cd)); cout<<"请输入n个点m条边的有向图"<<endl; cout<<"请输入n"<<endl; cin>>n; cout<<"请输入m"<<endl; cin>>m; int x=m; while(x--) { int a,b; cin>>a>>b; tu[a].push_back(b); rd[b]++; cd[a]++; } } void bianli()///遍历图 { cout<<"该图的所有边为:"<<endl; for(int i=1; i<=n; i++) { int l=tu[i].size(); for(int j=0; j<l; j++) cout<<i<<"->"<<tu[i][j]<<endl; } } void getdu()///得到各顶点的度 { for(int i=1; i<=n; i++) cout<<i<<"顶点的入度为"<<rd[i]<<"出度为"<<cd[i]<<endl; } void topu()///拓扑排序 { queue<int>q; for(int i=1; i<=n; i++) if(rd[i]==0) q.push(i); cout<<"拓扑排序顺序是:"<<endl; while(!q.empty()) { int t=q.front(); cout<<t<<' '; q.pop(); int l=tu[t].size(); for(int i=0; i<l; i++) { int to=tu[t][i]; rd[to]--; if(rd[to]==0) q.push(to); } } cout<<endl; } }; struct tu2 { vector<int>tu[N]; int n,m; bool vis[N]; void input() { cout<<"请输入n个点m条边的无向图"<<endl; cout<<"请输入n"<<endl; cin>>n; cout<<"请输入m"<<endl; cin>>m; int x=m; while(x--) { int a,b; cin>>a>>b; tu[a].push_back(b); tu[b].push_back(a); } } void dfs()///非递归深搜 { cout<<"非递归深搜序列为:"<<endl; memset(vis,0,sizeof(vis)); stack<int>s; s.push(1); while(!s.empty()) { int t=s.top(); cout<<t<<' '; s.pop(); vis[t]=1; int l=tu[t].size(); for(int i=0; i<l; i++) { int to=tu[t][i]; if(!vis[to]) vis[to]=1,s.push(to); } } cout<<endl; } void bfs()///广搜 { cout<<"广搜序列为:"<<endl; memset(vis,0,sizeof(vis)); queue<int>q; q.push(1); while(!q.empty()) { int t=q.front(); cout<<t<<' '; q.pop(); vis[t]=1; int l=tu[t].size(); for(int i=0; i<l; i++) { int to=tu[t][i]; if(!vis[to]) vis[to]=1,q.push(to); } } cout<<endl; } }; int main() { tu1 A; A.input(); A.bianli(); A.getdu(); A.topu(); tu2 B; B.input(); B.dfs(); B.bfs(); return 0; }
持续更新博客地址:
blog.csdn.net/martinue