题目大意:有N个学校和一些有向边将它们连结,求:
1.最少需要向几个学校发放软件,使得他们中的每一个学校最终都能够获得软件。
2.最少需要增加几条有向边使得可以从任意一个学校发放软件,使得每一个学校最终都能够获得软件。
分析:
1.缩点以后,找出入度为0的点的个数即可(因为没人可以给他们软件)。
2.缩点以后,答案即是max(入度为0的点,出度为0的点)。因为只要另每一对入度为0和出度为0的点相连接即可。
第二个问题也有无向图的版本,那样的话处理方法是:缩点以后,找出那些度为1的点,个数为cnt,向上整除2即可(即答案为(cnt+1)/2)。
代码如下:
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 8 const int N = 100+5; 9 10 stack S; 11 int scc_cnt; //强连通分量的个数 12 int dfs_clock; //访问到该节点的时间戳 13 int belong[N]; //belong[i]表示i节点所属于第几个强连通分量 14 int dfn[N]; //表示第i个节点被访问的时间 15 int low[N]; //表示第i个节点的子节点所能访问到的最小的dfn值 16 vector G[N]; 17 int in[100+5],out[100+5]; 18 19 void dfs(int u) 20 { 21 dfn[u] = low[u] = ++dfs_clock; 22 S.push(u); 23 for(int i=0;i