HDU-2647-邻接表模板

来源:互联网 发布:php date 格式化输出 编辑:程序博客网 时间:2024/05/24 22:42
#include<iostream>#include<cstring>#include<queue>#include<cstdio>using namespace std;#define MAX 10005int n, sum, ans;int into[MAX], head[MAX], money[MAX];struct Reward{    int to;    int next;} edge[2 * MAX];void addEdge(int u, int v, int tot){    edge[tot].to = v;    edge[tot].next = head[u];//上一条以u为起点的边的编号    head[u] = tot;//当前以u为起点的边的位置    into[v]++;//记录入度}void Init(){    for (int i = 1; i <= n; i++)    {        head[i] = -1;        into[i] = 0;        money[i] = 888;     }    sum = ans = 0;}void topu(){    int i, j, l, v;    queue<int>Q;    for (i = 1; i <= n; i++)        if (into[i] == 0)            Q.push(i);    while (!Q.empty())    {        v = Q.front();         sum += money[v];        Q.pop();        ans++;         for (l = head[v]; l != -1; l = edge[l].next) //与队首元素v有关的都枚举一遍,循环遍历        {            if (--into[edge[l].to] == 0)             {                Q.push(edge[l].to);                money[edge[l].to] = money[v] + 1;             }        }    }}int main(){    int m, a, b;    while (scanf("%d%d", &n, &m) != EOF)    {        Init();        for (int i = 0; i < m; i++)        {            scanf("%d%d", &a, &b);            addEdge(b, a, i);        }        topu();        if (ans != n)             sum = -1;        cout << sum << endl;    }    return 0;}
0 0