题目链接:http://poj.org/problem?id=2186

题目意思大概是:给定N(N<=10000)个点和M(M<=50000)条有向边,求有多少个“受欢迎的点”。所谓的“受欢迎的点”当且仅当任何一个点出发都能到达它。

原来的图是无序且可能有环,用tarjan缩点,变成一个DAG。受欢迎点的出度一定为0,所以缩点后求有多少个连通分量的出度是0,要是大于1则没有受欢迎的点,等于1的话求出这个出度为0的连通分量有多少个点。

强联通分量tarjan算法里邻接表用vector一般好理解,但是速度不及链式前向星,链式前向星学习链接:http://blog.csdn.net/acdreamers/article/details/16902023

AC代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
const int MAXN = 1e4 + ;
struct data {
int next , to;
}edge[MAXN * ];
int head[MAXN] , low[MAXN] , dfn[MAXN] , block[MAXN] , st[MAXN];
int top , ord , sccnum;
bool instack[MAXN] , out[MAXN]; void init(int n) {
for(int i = ; i <= n ; i++) {
low[i] = dfn[i] = ;
head[i] = -;
instack[i] = false;
}
top = ord = sccnum = ;
} void tarjan(int u) {
low[u] = dfn[u] = ++ord;
st[++top] = u;
instack[u] = true;
for(int i = head[u] ; ~i ; i = edge[i].next) { //链式前向星
int v = edge[i].to;
if(!dfn[v]) {
tarjan(v);
low[u] = min(low[u] , low[v]);
}
else if(instack[v]) {
low[u] = min(low[u] , dfn[v]);
}
}
if(low[u] == dfn[u]) {
int v;
sccnum++;
do {
v = st[top--];
instack[v] = false;
block[v] = sccnum;
}while(u != v);
}
} int main()
{
int n , m , u , v;
while(~scanf("%d %d" , &n , &m)) {
init(n);
for(int i = ; i < m ; i++) {
scanf("%d %d" , &u , &v);
edge[i].to = v; //链式前向星
edge[i].next = head[u];
head[u] = i;
}
for(int i = ; i <= n ; i++) {
if(!dfn[i])
tarjan(i);
}
memset(out , false , sizeof(out)); //缩点是否有入度
for(int u = ; u <= n ; u++) {
for(int i = head[u] ; ~i ; i = edge[i].next) { //链式前向星
int v = edge[i].to;
if(block[v] != block[u]) //不是同一个连通分量
out[block[u]] = true;
}
}
int res = , op = -;
for(int i = ; i <= sccnum ; i++) {
if(!out[i]) { //出度为0的点
res++;
op = i;
}
}
if(res > ) {
printf("0\n");
}
else {
res = ;
for(int i = ; i <= n ; i++) {
if(block[i] == op)
res++;
}
printf("%d\n" , res);
}
}
}

最新文章

  1. solr查询语句示例
  2. 在网页中让Backspace按键不可作为退回使用
  3. iOS Outlets Referencing Outlets
  4. winform的datagridview单元格输入限制和右键单击datagridview单元格焦点跟着改变
  5. 初尝seajs,只提供自己学习做笔记
  6. STL_iterator迭代器(2)——几种迭代器对象的用法
  7. BestCoder Round #36 (hdu5199)Gunner(水题)
  8. C++输入和输出
  9. CF 322B Ciel and Flowers 贪心水题
  10. UVa 10405 &amp; POJ 1458 Longest Common Subsequence
  11. 【转】Linux设备驱动--块设备(一)之概念和框架
  12. Cocos2D v2.0至v3.x简洁转换指南(五)
  13. [C++]数据结构-排序:插入排序之直接插入排序
  14. Java虚拟机垃圾收集器
  15. Git简介及安装
  16. List&lt;&gt; of struct with property. Cannot change value of property. why?
  17. Python 语法提示vim配置
  18. LeetCode122.买卖股票的最佳时机II
  19. Android 新老两代 Camera API 大起底
  20. FLIR ONE PRO热成像仪

热门文章

  1. uva1262Password
  2. Jqgrid入门-操作表格的数据(二)
  3. 如何使用 orachk 工具
  4. 图片鼠标滑过图片半透明(jquery特效)
  5. jQuery-对Radio/CheckBox的操作集合
  6. 【转】android:layout_gravity和android:gravity的区别
  7. ECshop 二次开发模板教程3
  8. ylbtech-Model-Account(通用账户模块设计)
  9. DDOS的攻击原理和防护指南
  10. SQL知识累积