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

来源:互联网 发布:普鲁申科 亚古丁 知乎 编辑:程序博客网 时间:2024/06/05 13:25

可能本人比较懒,图的邻接表用到了C++STL里面的vector,不过思路是一样的

代码:

#include<bits/stdc++.h>#define N 1009using 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 61 21 31 62 42 52 64 51 24 24 31 33 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;}


阅读全文
0 0
原创粉丝点击