可能本人比较懒,图的邻接表用到了C++STL里面的vector,不过思路是一样的
代码:
#include<bits/stdc++.h>
#define N 1009
using namespace std;
typedef pair<int, int> P;
vector<int> mp[N], mp1[N];
int n, m, mm, nn;
void menu()
{
printf("\t\t1.建图\n");
printf("\t\t2.输出邻接表\n");
printf("\t\t3.各顶点的度\n");
printf("\t\t4.dfs\n");
printf("\t\t5.bfs\n");
printf("\t\t6.退出\n");
}
void init()
{
printf("建立无向图\n");
printf("请输入m, n和m个顶点n条边\n");
int u, v;
scanf("%d%d", &m, &n);
for(int i = 1; i <= m; i++) mp[i].clear();
for(int i = 1; i <= n; i++)
{
scanf("%d%d", &u, &v);
mp[u].push_back(v);
mp[v].push_back(u);
}
printf("建立有向图\n");
printf("请输入m, n和m个顶点n条边\n");
scanf("%d%d", &mm, &nn);
for(int i = 1; i <= mm; i++) mp1[i].clear();
for(int i = 1; i <= nn; i++)
{
scanf("%d%d", &u, &v);
mp1[u].push_back(v);
}
printf("创建成功!\n");
}
void display()
{
for(int i = 1; i <= m; i++)
{
int k = mp[i].size();
printf("%d能到达的: ", i);
for(int j = 0; j < k; j++) cout << mp[i][j] << " ";
cout << endl;
}
cout << endl;
for(int i = 1; i <= mm; i++)
{
int k = mp1[i].size();
printf("%d能到达的: ", i);
for(int j = 0; j < k; j++) cout << mp1[i][j] << " ";
cout << endl;
}
cout << endl;
}
void display_D()
{
printf("无向图:\n");
for(int i = 1; i <= m; i++)
{
int k = mp[i].size();
printf("顶点%d: %d\n", i, k);
}
printf("有向图:\n");
int d[N];
memset(d, 0, sizeof(d));
for(int i = 1; i <= mm; i++)
{
int k = mp1[i].size();
for(int j = 0; j < k; j++) d[mp1[i][j]]++;
}
for(int i = 1; i <= mm; i++)
{
int k = mp1[i].size();
printf("顶点%d: 出度 %d 入度 %d\n", i, k, d[i]);
}
}
//非递归
void dfs()
{
int vis[N], i, j;
char ans[N];
int cnt = 0;
ans[cnt++] = 1 + '0';
memset(vis, 0, sizeof(vis));
vis[1] = 1;
stack<P> s;
P ss;
ss.first = 1;
ss.second = 0;
s.push(ss);
while(!s.empty())
{
P u = s.top();
int k = mp[u.first].size();
for(j = u.second; j < k; j++)
{
int v = mp[u.first][j];
s.top().second++;
if(s.top().second == k) s.pop();
if(vis[v]) continue;
vis[v] = 1;
ss.first = v;
ss.second = 0;
s.push(ss);
ans[cnt++] = v + '0';
break;
}
}
for(i = 1; i <= m; i++) if(!vis[i]) ans[cnt++] = i + '0';
for(i = 0; i < cnt; i++) printf("%c ", ans[i]);
cout << endl;
}
void bfs()
{
int vis[N], i, j;
char ans[N];
int cnt = 0;
memset(vis, 0, sizeof(vis));
queue<int> q;
q.push(1);
vis[1] = 1;
ans[cnt++] = 1 + '0';
while(!q.empty())
{
int u = q.front();
q.pop();
int k = mp[u].size();
for(j = 0; j < k; j++)
{
int v = mp[u][j];
if(vis[v]) continue;
vis[v] = 1;
q.push(v);
ans[cnt++] = v + '0';
}
}
for(i = 1; i <= m; i++) if(!vis[i]) ans[cnt++] = i + '0';
ans[cnt] = '\0';
for(i = 0; i < cnt; i++) printf("%c ", ans[i]);
cout << endl;
}
/*
样例:
6 6
1 2
1 3
1 6
2 4
2 5
2 6
4 5
1 2
4 2
4 3
1 3
3 1
*/
int main()
{
while(true)
{
int sel;
menu();
scanf("%d", &sel);
switch(sel)
{
case 1: init(); break;
case 2: display(); break;
case 3: display_D(); break;
case 4: dfs(); break;
case 5: bfs(); break;
}
if(sel == 6) break;
}
return 0;
}