1 /* 2 题意:第i个人选择第a[i]个人,问组成强联通分量(自己连自己也算)外还有多少零散的人 3 有向图强联通分量-Tarjan算法:在模板上加一个num数组,记录每个连通分量的点数,若超过1,则将连通点数相加 4 用总点数-ans则是零散的点 5 详细解释:http://www.bubuko.com/infodetail-927304.html 6 */ 7 #include8 #include 9 #include 10 #include 11 #include 12 using namespace std;13 14 const int MAXN = 1e5 + 10;15 const int INF = 0x3f3f3f3f;16 vector G[MAXN];17 stack S;18 int pre[MAXN], low[MAXN];19 int instack[MAXN], num[MAXN];20 int dfs_clock, scc_cnt;21 int n, ans;22 23 void DFS(int u)24 {25 instack[u] = 1;26 pre[u] = low[u] = ++dfs_clock;27 S.push (u);28 for (int i=0; i 1) ans += num[i];89 }90 printf ("%d\n", n - ans);91 }92 93 return 0;94 }