1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; const int N = 2e4+5; const int M = 5e4+5;
struct E { int to, next; } e[M];
int H[N], tot;
int S[N], top; int dfn[N], low[N], bel[N], idx, scc;
int n, m, cost[N]; int u, v;
int sc[N], id[N];
void add(int from, int to) { e[tot] = {to, H[from]}; H[from] = tot++; }
void dfs(int u) { dfn[u] = low[u] = ++idx; S[++top]=u;
for(int i=H[u]; ~i; i=e[i].next) { int v = e[i].to; if(!dfn[v]) { dfs(v); low[u] = min(low[u], low[v]); } else if(!bel[v]) low[u] = min(low[u], dfn[v]); } if(low[u]==dfn[u]) { scc++; int t; do { t=S[top--]; bel[t]=scc; } while(t!=u); } }
void tarjan() { memset(dfn, 0, sizeof(dfn)); memset(bel, 0, sizeof(bel)); idx = scc = top = 0; for(int i=1; i<=n; i++) { if(!dfn[i]) dfs(i); } }
void solve(int &num, int &sum) { memset(sc, inf, sizeof(sc)); memset(id, 0, sizeof(id));
for(int i=1; i<=n; i++) sc[bel[i]] = min(sc[bel[i]], cost[i]);
for(int u=1; u<=n; u++) { for(int i=H[u]; ~i; i=e[i].next) { int v = e[i].to; if(bel[u]!=bel[v]) { id[bel[v]]++; } } }
int a=0, b=0; for(int i=1; i<=scc; i++) { if(!id[i]) num++, sum+=sc[i]; } }
int main(void) { while(scanf("%d%d", &n, &m)==2) { memset(H, -1, sizeof(H)); tot = 0; for(int i=1; i<=n; i++) scanf("%d", &cost[i]); for(int i=0; i<m; i++) { scanf("%d%d", &u, &v); add(u, v); } tarjan(); int num=0, sum=0; solve(num, sum); printf("%d %d\n", num, sum); } return 0; }
|