数据结构——图的遍历和存储

本文介绍了一种使用C++ STL中的vector实现图的邻接表的方法,并提供了包括建图、输出邻接表、计算顶点度数、深度优先搜索(DFS)和广度优先搜索(BFS)等功能的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可能本人比较懒,图的邻接表用到了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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值