很容易看出是拓扑 但不容易想出来怎么做【可能是我太菜
首先 入度为零的人是肯定死不了的
接着 我们分成环和链分析
对于一个链
最多的情况就是顺着一个个开枪 最后剩一个( (n - 1) -> (n), (n - 2) ->(n - 1) …… )
最少的情况就是死一半(1->2, 3->4……)
对于一个环
它和链基本上一样
区别在于从任何一个人开始都不会影响结果
这个性质很有用
因为当有环接在链上时
最多的情况下环上的点会全部挂掉
1 void bfs(){ 2 for(int i = 1; i <= n; i++) 3 if(!ind[i]){ 4 q[++ans1] = i; 5 ans2++; 6 } 7 for(int i = 1; i <= ans1; i++){ 8 int fro = aim[q[i]]; 9 if(vis[fro]) continue; 10 ind[aim[fro]]--; 11 vis[fro] = 1; 12 otd[aim[fro]] = 1; 13 if(!ind[aim[fro]]) q[++ans1] = aim[fro]; 14 }//删链过程 非常重要! 15 for(int i = 1; i <= n; i++) 16 if(!vis[i] && ind[i]){ 17 int len = 0, flag = 0; 18 for(int j = i; !vis[j]; j = aim[j]){ 19 vis[j] = 1; 20 len++; 21 flag |= otd[j]; 22 } 23 //printf("%d %d\n", flag, len); 24 ans1 += (len >> 1); 25 if(len > 1 && !flag) ans2++; 26 } 27 }