hdu2647

题目来自

本题就一简单的拓扑,不多说,贴代码了。想了解更多有关拓扑排序的请http://tobyaa.blog.163.com/blog/static/30248591201261810257856/

#include<iostream>
#include<queue>
using namespace std;
#define N 10009
int in[N],money[N];
int n,m;
struct node
{
    int data;
    struct node *next;
}point[N];


void add(int x,int y)//把y节点插到x后面
{
    node *temp;
    temp=(node *)malloc(sizeof(node));
    temp->data=y;
    temp->next=point[x].next;
    point[x].next=temp;
}
void init()
{
    for(int i=0;i<=n;i++)
    {
        point[i].data=i;
        point[i].next=NULL;
        money[i]=888;
        in[i]=0;
    }
}
int main()
{
    int i;
    int a,b;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        init();
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            add(b,a);
            in[a]++;
        }
        queue<int> q;
        for(i=1;i<=n;i++)
        {
            if(in[i]==0)
                q.push(i);
        }
        int ans=0,num=0;
        while(!q.empty())
        {
            int fr=q.front();
            q.pop();
            num++;  
            ans+=money[fr];
            for(node *p=point[fr].next;p;p=p->next)
            {
                in[p->data]--;//把与之相连的节点的入度值全部减1
                if(in[p->data]==0)//判断是否为根
                {
                    q.push(p->data);
                    money[p->data]=money[fr]+1;
                }
            }
        
        }
        if(num!=n) //判断环
                printf("-1\n");
            else
                printf("%d\n",ans);
    }
    return 0;
}

第一次写博客,只求共同学习

posted on 2013-07-18 20:31  黎昊明  阅读(233)  评论(0编辑  收藏  举报

导航