【模板】拓撲排序
阿新 • • 發佈:2020-09-18
【模板】拓撲排序
#include<iostream> #include<cstring> #include<cstdio> #include<string> #include<queue> #include<stack> #include<algorithm> #include<vector> #include<map> using namespace std; const int INF= 0x3f3f3f3f; int head[500001]; int ans=0; struct Edge { int u, v, w, next; }e[500001]; void add(int u,int v) { e[++ans].next = head[u]; e[ans].v = v; head[u] = ans; } int IN[500001];//入度 int OUT[500001];//出度 int d[500001]; int n, m; void topsort()//拓撲排序 { queue<int> q; for (int i = 1; i <= n; i++) { if(IN[i]==0)//入讀為0的點入佇列 { q.push(i); d[i] = 1; } } while(!q.empty()) { int t = q.front(); q.pop(); for (int i = head[t]; i != 0;i=e[i].next) { int uu = e[i].v; d[uu] = (d[t]+d[uu])%80112002; IN[uu]--;//入度-- if(IN[uu]==0)//入讀為0的點入佇列 { q.push(uu); } } } } int main() { cin >> n >> m; memset(IN, 0, sizeof(IN)); memset(d, 0, sizeof(d)); memset(OUT, 0, sizeof(OUT)); for (int i = 1; i <= m;i++) { int x, y; cin >> x >> y; add(x, y); IN[y]++; OUT[x]++; } topsort(); int total = 0; for (int i = 1; i <= n;i++) { if(OUT[i]==0) total= (total+d[i])%80112002; } cout << total%80112002; return 0; }