您的位置:首页 > 产品设计 > UI/UE

2014 UESTC Training for Graph Theory Problem I 方老师的分身 III

2014-06-25 08:47 435 查看
非常忧伤的WA了很多次。输入的时候 点搞反了。。。

就是拓扑排序。

入度为零的点 入队,分配888。

然后 挨个出队,找到所有 邻接点 然后分配的+1 并入队。此点出队。

结束条件是队列为空,即所有点都被搜过一次。不满足条件就是点重复入队了,也就是环。

点可能有10000 个,不能用邻接矩阵。但是边只有 20000。属于稀疏图。

可以使用邻接表。但是这个题边没有权。所以偷懒用了vector。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
int n,m;
int in[10001];
int ans[10001];
int main()
{
    int x,y;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        vector <int> g[10001];
        memset(in,0,sizeof(in));
        memset(ans,0,sizeof(ans));
        while(m--)
        {
            scanf("%d%d",&x,&y);
            g[y].push_back(x);
            in[x]++;
        }
        queue<int>q;
        for(int i=1;i<=n;i++)
        {
            if(in[i]==0)
            {
                q.push(i);
                ans[i]=888;
            }
        }
        int number=0;
        while(!q.empty())
        {
            int tmp=q.front();q.pop();
            number++;
            for(int i=0;i<g[tmp].size();i++)
            {
                int v=g[tmp][i];
                in[v]--;
                if(in[v]==0)
                {
                    ans[v]=ans[tmp]+1;
                    q.push(v);
                }
            }
        }
        if(number<n)puts("-1");
        else
        {
            int sum=0;
            for(int i=1;i<=n;i++)
                sum+=ans[i];
            printf("%d\n",sum);
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: