DAG图的存储与DFS遍历

const int maxv = 1000;
const int maxe = 5000;
const int maxn = 1000;
/*
* 邻接矩阵
*
*/
struct adjMetrix {
    int G[maxn+10][maxn+10];
    int visit[maxn]; //标记点访问与否
    int n;
    void addedge(int u, int v) {
        G[u][v] = 1;
        return ;
    }
    void read() {
        memset(G, 0, sizeof(G));
        memset(visit, 0, sizeof(visit));
        int u, v, w;
        scanf("%d", &n);
        for (int i=0; i<n; i++) {
            scanf("%d %d", &u, &v);
            addedge(u, v);
        }
        return ;
    }
    void dfs(int i) {
        for (int j=0; j<=n; j++) {
            if (G[i][j]!=0 && visit[j]==0) {
                printf("%d %d\n", i, j);
                visit[j] = 1;
                dfs(j);
            }
        }
    }
};

/*
* 邻接链表
*
*/
struct Edge {
    int to, w, next;
};

struct adjTable {
    int node[maxv];
    int visit[maxe];
    int cnt;
    struct Edge e[maxe];
    void init() {
        memset(node, -1, sizeof(node));
        memset(visit, 0, sizeof(visit));
        cnt = 0;
    }
    void addedge(int u,int v) {
        e[cnt].to = v;
        e[cnt].next = node[u];
        node[u] = cnt++;
    }
    void read() {
        int n, u, v, w;
        scanf("%d", &n);
        for (int i=1; i<=n; i++) {
            scanf("%d %d", &u, &v);
            addedge(u, v);
        }
        return ;
    }
    void dfs(int p) {
        int i;
        for (i=node[p]; i!=-1; i=e[i].next) {
            if (visit[ e[i].to ] == 0) { //如果下一条边的指向点未被访问过
                printf("%d %d\n", p, e[i].to);
                visit[ p ] = 1; //标记当前点已被访问
                dfs( e[i].to );
            }
        }
    }
};
posted @ 2015-08-19 11:52  站在边缘的人  阅读(823)  评论(0编辑  收藏  举报