加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

邻接表建立有向图

(2011-04-05 18:31:58)
标签:

邻接表

it

分类: poj

要求:利用邻接表建立有向图

有向图如下

 

       http://s10/middle/67607011g766a8b41af69&690

程序处理后的结果

      http://s11/middle/67607011ga0297e840671&690

#include <iostream>
using namespace std;

const int MAX = 100 + 10;

struct EDGE
{
    int v;
    // int w;
    int next;
};

 

EDGE map[MAX];  
int adj[MAX];   // adj[u] = e:输入的边中最后一条以点u为起点的边的编号(或者说在数组map中的位置为e)
bool vis[MAX];   // 访问标志
int n, m;    // 点数  边数

 

// 建立有向图
void CreateDigraph(void)
{
    memset(adj, -1, sizeof(-1));
    int e = 0;
    int u, v;
    cin >> n >> m;
    while (m--)
    {
        // 加入一条新边:u-->v 
        cin >> u >> v;
        map[e].v = v;
        map[e].next = adj[u];
        adj[u] = e;
        e++;
    }
}

// 输出v:u-->v
void OutputAdjNode(int u)
{
    for (int k=adj[u]; k!=-1; k=map[k].next)
    {
        int v = map[k].v;
        cout << v << " ";
    }
    cout << endl;
}

void Dfs(int u)
{
    vis[u] = true;
    cout << u << " ";
    for (int k=adj[u]; k!=-1; k=map[k].next)
    {
        int v = map[k].v;
        if (!vis[v])
        {
            Dfs(v);
        }
    }
}

// 深度优先遍历

void DfsTraverse(void)
{
    memset(vis, 0, sizeof(vis));
    for (int i=0; i<n; i++)
    {
        if (!vis[i])
        {
            Dfs(i);
        }
    }
    cout << endl;
}

int main(void)
{
    CreateDigraph();
    DfsTraverse();
    // OutputAdjNode(0);
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有