码迷,mamicode.com
首页 > 编程语言 > 详细

拓扑排序-hihocoder1175

时间:2019-06-08 17:34:22      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:ini   href   一点   有向图   就是   sizeof   拓扑   set   hihocoder   

https://hihocoder.com/problemset/problem/1175

主要是要明白拓扑排序的概念,就是找出满足用有向图表示的偏序关系的全序关系,知道这一点之后,直接模拟即可。不断寻找入度为0的点加进来,把相邻的点入度减一。重复到无法添加。

 

const int MAXN=(int)1e5+5,MOD=142857;
vector<int>e[MAXN];
int a[MAXN],head[MAXN],ind[MAXN],vis[MAXN];
void init(){
    memset(ind,0,sizeof(ind));
    memset(head,0,sizeof(head));
    
}
void solve(){
    init();
    int n,m,u,v,k,sum(0);
    cin>>n>>m>>k;
    for(int i=1;i<=k;i++){
        scanf("%d",&u);
        a[u]++;
    }
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        e[u].push_back(v);
        ind[v]++;
    }
    queue<int>que;
    for(int i=1;i<=n;i++){
        if(!ind[i]){
        //    ind[i]--;
            que.push(i);
            vis[i]=1;
        }
    }
    while(!que.empty()){
        int tmp=que.front();
        //cout<<tmp<<" "<<a[tmp]<<endl;
        que.pop();
        sum=(sum+a[tmp])%MOD;
        for(int i=0;i<e[tmp].size();i++){
            if(!vis[e[tmp][i]]){
                ind[e[tmp][i]]--;
                a[e[tmp][i]]+=a[tmp];
                a[e[tmp][i]]%=MOD;
                if(!ind[e[tmp][i]]){
                    vis[e[tmp][i]]=1;
                    que.push(e[tmp][i]);
                }
            }
        }
        
    }
    cout<<sum<<endl;
}

 

拓扑排序-hihocoder1175

标签:ini   href   一点   有向图   就是   sizeof   拓扑   set   hihocoder   

原文地址:https://www.cnblogs.com/wengsy150943/p/10991165.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!