hihocoder#1175(拓扑排序)
1 #include <iomanip> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 using namespace std; 10 vector<int>e[100100]; 11 int n,m,t,k,inbug[100100],sum,a[101000],vi[101000]; 12 void topsort() 13 { 14 queue<int>q; 15 for(int i=1;i<=n;i++) 16 if(inbug[i]==0) 17 q.push(i); 18 while(!q.empty()) 19 { 20 int now=q.front(); 21 q.pop(); 22 for(int i=0;i<e[now].size();i++) 23 { 24 if(--inbug[e[now][i]]==0) 25 q.push(e[now][i]); 26 vi[e[now][i]]=(vi[e[now][i]]+vi[now])%142857; 27 } 28 } 29 30 } 31 int main(int argc, char *argv[]) 32 { 33 scanf("%d%d%d",&n,&m,&k); 34 memset(vi,0,sizeof(vi)); 35 for(int i=1;i<=n;i++) 36 e[i].clear(); 37 memset(inbug,0,sizeof(inbug)); 38 memset(a,0,sizeof(a)); 39 for(int i=0;i<k;i++) 40 { 41 int t; 42 scanf("%d",&t); 43 vi[t]++;; 44 } 45 while(m--) 46 { 47 int u,v; 48 scanf("%d%d",&u,&v); 49 e[u].push_back(v); 50 inbug[v]++; 51 } 52 topsort(); 53 sum=0; 54 for(int i=1;i<=n;i++) 55 sum=(sum+vi[i])%142857; 56 printf("%d\n",sum); 57 return 0; 58 }