hdu 2647(拓扑排序,判断有向图是否存在回路及自环,并统计每个顶点的前驱点数)

View Code
/*

  Name: 拓扑排序,判断有向图是否存在回路及自环,并统计每个顶点的前驱点数 

  Copyright: 

  Author: Try86

  Date: 15/04/12 22:25

  Description: 

*/



#include <queue>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <iostream>



using namespace std;



const int N = 10005;



int sum, flag;

int counts[N];

struct node {

    int v;

    node *next;

    node(int vv, node *p) {

        v = vv;

        next = p;

    }

};

struct graph {

    int inDeg; //统计入度数 

    node *link;

}G[N];



void init(int n) {

    for (int i=1; i<=n; ++i) {

        G[i].inDeg = 0;

        G[i].link = NULL;

        counts[i] = 0;

    }

    return ;

} 



void buildG(int u, int v) {

    node *p = new node(v, G[u].link);

    G[u].link = p;

    ++G[v].inDeg;

    return ;

}



void topoSort(int n) {

    sum = 0;

    flag = true;

    queue<int> Q;

    for (int i=1; i<=n; ++i) {//入度数为0的点入队列 

        if (G[i].inDeg == 0) Q.push(i), --G[i].inDeg;

    }

    while (!Q.empty()) {

        int u = Q.front();

        sum += counts[u];  //统计所有点的总的前驱点数 

        Q.pop();

        for (node *p=G[u].link; p; p=p->next) {

            --G[p->v].inDeg;  //与u邻接的点的入度数减1 

            if (G[p->v].inDeg == 0) {

                Q.push(p->v);

                counts[p->v] = counts[u] + 1;//统计点v的前驱点数 

            }

        }

    }

    for (int i=1; i<=n; ++i) {//判断是否有回路或自环 

        if (G[i].inDeg > 0) {

            flag = false;

            break;

        }

    }

    return ;

}



void del(node *p) {

    if (!p) return ;

    del(p->next);

    delete p;

    return ;

}



int main() {

    int n, m;

    while (scanf("%d%d", &n, &m) != EOF) {

        init(n);

        int u, v;

        for (int i=0; i<m; ++i) {

            scanf ("%d%d", &u, &v);

            buildG(v, u);  //注意建图的顶点顺序 

        }

        topoSort(n);

        if (flag) printf ("%d\n", 888*n+sum);

        else printf ("-1\n");

        for (int i=1; i<=n; ++i) del(G[i].link);

    }

    return 0;

}

 

你可能感兴趣的:(HDU)