hiho一下 第四十八周(拓扑排序的应用)48

来源:互联网 发布:梨园淘宝城图片 编辑:程序博客网 时间:2024/05/17 00:15

///////////////////////////////////////////////////////////////////////////////////////////////////////
作者:tt267
声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0
转载请注明:http://blog.csdn.net/tt2767/article/details/46364717
///////////////////////////////////////////////////////////////////////////////////////////////////////


题目链接:http://hihocoder.com/problemset/problem/1175
队列和栈都能过

#include<iostream>#include<algorithm>#include <iterator>#include<cmath>#include<vector>#include<stack>#include<map>#include<set>#include<staue>#include<functional>#include<stdlib.h>#include<cstring>using namespace std;#define PI acos(-1.0)#define MOD 142857vector<int> Graph[500009];stack<int> sta;int N,M,K,ver;int u,v;int deg[500009] = {0};int vir[500009] = {0};int solve();int main(){    memset(vir,0,sizeof(vir));    memset(deg,0,sizeof(deg));    scanf("%d%d%d",&N,&M,&K);    for(int i = 0 ; i < K ; i++)    {        scanf("%d",&ver);        vir[ver]++;    }    for(int i = 0; i < M ; i++ )    {        scanf("%d%d",&u,&v);        Graph[u].push_back(v);        deg[v]++;    }    printf("%d\n",solve());    return 0;}int solve(){    int x,Count = 0;    for(int i = 0 ; i < N ; i++ )        if(deg[i] == 0)            sta.push(i);    while(!sta.empty())    {        x = sta.top();        sta.pop();        Count += vir[x];        Count %= MOD;        for(vector<int>::iterator it = Graph[x].begin() ; it != Graph[x].end() ; it++)        {            if( !deg[*it] )                continue;            deg[*it]--;            vir[*it] += vir[x];            vir[*it] %= MOD;            if( !deg[*it] )                sta.push(*it);        }    }    return Count;}
0 0
原创粉丝点击