首页 > 技术文章 > 5166. 卢学魔

traveller-ly 2018-10-06 16:06 原文

Description

Input

Output

Sample Input

10 16
1 2
1 4
1 10
2 3
2 5
4 3
4 5
4 8
6 5
7 6
7 9
8 5
9 8
10 6
10 7
10 9

Sample Output

9

Data Constraint

 
做法:拓扑排序找链
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <queue>
 5 #define rep(i,a,b) for(int i=a;i<=b;i++)
 6 #define N 100007
 7 using namespace std;
 8 int n,m,ans,tot,ls[N],val[N];
 9 int rd[N],cd[N];
10 bool vis[N];
11 struct arr{
12     int to,next;
13 }e[N*2];
14 queue<int> q;
15 
16 void Add(int x,int y){
17     e[++tot].to=y;
18     e[tot].next=ls[x];
19     ls[x]=tot;
20 }
21 
22 int main(){
23     scanf("%d%d",&n,&m);
24     rep(i,1,m){
25         int x,y;
26         scanf("%d%d",&x,&y);
27         Add(x,y);
28         rd[y]++;
29         cd[x]++;
30         vis[x]=vis[y]=1;
31     }
32     rep(i,1,n) if(!rd[i]&&vis[i]) q.push(i),val[i]=1;
33     for(;!q.empty();){
34         int now=q.front();
35         q.pop();
36         for(int i=ls[now];i;i=e[i].next){
37             val[e[i].to]+=val[now];
38             rd[e[i].to]--;
39             if(!rd[e[i].to])    q.push(e[i].to);
40         }
41     }
42     rep(i,1,n)    if(!cd[i]) ans+=val[i];
43     printf("%d",ans);
44 }
View Code

 

 

推荐阅读