1、键盘输入数据,建立一个有向图的邻接表。
2、输出该邻接表。
3、在有向图的邻接表的基础上计算各顶点的度,并输出。
4、以有向图的邻接表为基础实现输出它的拓扑排序序列。
5、采用邻接表存储实现有向图的深度优先递归遍历。
6、采用邻接表存储实现有向图的广度优先遍历(利用队列实现)。
7、编写一个主函数,调试上述算法。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e4;
typedef struct Graph{
vector <int> edge[MAXN];
int n;
int cntin[MAXN],cntout[MAXN];
bool vis[MAXN];
public:
void ini(){
int m,x,y;
bool is_dir;
cin>>n>>m>>is_dir;
for(int i=1;i<=n;i++) edge[i].clear(),cntin[i]=cntout[i]=0;
for(int i=1;i<=m;i++){
cin>>x>>y;
edge[x].push_back(y);
cntout[x]++;cntin[y]++;
if(!is_dir) edge[y].push_back(x),cntin[x]++,cntout[y]++;
}
}
void show(){
for(int i=1;i<=n;i++){
int len=edge[i].size();
cout<<i<<" :";
for(int j=0;j<len;j++)
cout<<' '<<edge[i][j];
cout<<endl;
}
}
void cnt(){
for(int i=1;i<=n;i++)
cout<<i<<" :"<<cntin[i]+cntout[i]<<endl;
}
void Topology_Sequence(){
int cnt[n+1];
for(int i=1;i<=n;i++) cnt[i]=cntin[i];
queue <int> que;
for(int i=1;i<=n;i++) if(cnt[i]==0) que.push(i);
int now;
while(!que.empty()){
now=que.front();que.pop();
cout<<now<<' ';
int len=edge[now].size();
for(int i=0;i<len;i++){
cnt[edge[now][i]]--;
if(cnt[edge[now][i]]==0) que.push(edge[now][i]);
}
}
cout<<endl;
}
void dfs(int pos){
if(vis[pos]) return ;
cout<<pos<<' ';
vis[pos]=1;
int len=edge[pos].size();
for(int i=0;i<len;i++) dfs(edge[pos][i]);
}
void Travel_dfs(){
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
dfs(i);
cout<<endl;
}
void Travel_bfs(){
memset(vis,0,sizeof(vis));
queue <int> que;
for(int i=1;i<=n;i++) if(cntin[i]==0) que.push(i),vis[i]=1;
int now;
while(!que.empty()){
now=que.front();que.pop();
cout<<now<<' ';
int len=edge[now].size();
for(int i=0;i<len;i++){
if(vis[edge[now][i]]==0)
que.push(edge[now][i]),vis[edge[now][i]]=1;
}
}
cout<<endl;
}
}Graph;
int main()
{
Graph a;
a.ini();
a.cnt();
a.Topology_Sequence();
a.Travel_dfs();
a.Travel_bfs();
}
样例输入:
12 16 1
1 2
1 3
1 4
1 12
2 3
3 5
3 7
3 8
4 5
5 7
6 8
9 10
9 12
9 11
10 12
11 6