对于一个能够确定名次的点,可以注意到,对于该点,入度和出度的数量加起来等于N-1
(这样还是不够准确的
确切的说是,能够到达这个点的数量和这个点能够到达的数量的和

floyd不仅可以求两个点之间的最短路径,还能求两个点彼此是否能够相互到达
最后对于一个可以确定名次的点,能够到达的所有的点 加上 能够到达该点的所有点的和必须等于n-1
当然,我们可以通过二进制来简化这个过程

最后处理结果时,设一个变量flag, 因为该点能够到达本身,flag初值赋为1
对于两个点i, j首先f[i][j] | f[j][i]
因为对于这两个点,无论从j到i或是从i到j,都需算上。
同时用flag与f[i][j] | f[j][i]相&
按位与的操作是两位全为1,则得到的值为1,也就是说,若有任何一点不能到达此点或是由此点到达,我们就无法求出该点的名次
最后我们用计数器ans累加flag的值即可

 #include<bits/stdc++.h>
using namespace std;
const int maxn = ;
int n, m, ans = ;
int f[maxn][maxn]; inline int read() {
int x = , y = ;
char ch= getchar();
while(!isdigit(ch)) {
if(ch == '-') y = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) + ch - '';
ch = getchar();
}
return x * y;
} int main() {
n = read(), m = read();
for(int i = ; i <= m; ++i) {
int x, y;
x = read(), y = read();
f[x][y] = ;
}
for(int k = ; k <= n; ++k)//floyd求两个点能否互相到达
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j)
f[i][j] |= f[i][k] & f[k][j];
for(int i = ; i <= n; ++i) {
int flag = ;//判断i点是否能够求出具体的名次
for(int j = ; j <= n; ++j) {
if(i == j) continue;
else flag &= f[i][j] | f[j][i];
}
ans += flag;//统计答案
}
cout << ans << '\n';
return ;
}

最新文章

  1. Pending Statistics
  2. 浏览器渲染原理--reflow
  3. eclipse下使用API操作HDFS
  4. centos 安装RAR
  5. 深入浅出数据结构C语言版(20)——快速排序
  6. DOM遍历 - 后代
  7. C# 数组比较--取得两个集合的交集,差集,并集的方法
  8. Java关于读取Excel文件~xlsx xls csv txt 格式文件~持续汇总~
  9. 服务器Nginx 反向代理 其他服务器 8181端口 失败的问题
  10. pandas导入导出数据-【老鱼学pandas】
  11. win10操作系统 安装nodejs报2503错误解决方法
  12. yaf twig配置
  13. Data Visualization – Banking Case Study Example (Part 1-6)
  14. pytorch--nn.Sequential学习
  15. STL 小白学习(3) vector
  16. Linux共享库LD_LIBRARY_PATH与ld.so.conf
  17. eclipse添加缺失的包/src/main/resource
  18. HTML学习-2标记标签-2
  19. ctags的如何生成tags文件
  20. Ubuntu中的Gif动画录制工具

热门文章

  1. 我的emacs配置部分
  2. [UOJ#351]新年的叶子
  3. warning LNK4070的解决办法
  4. pycharm激活(JetBrains IDEA 系列产品通用xx方法(license server))
  5. xiaoluo同志Linux学习之CentOS6.4
  6. 【BZOJ1901】Dynamic Rankings [整体二分]
  7. thinkphp 随机获取一条数据
  8. python3 基础概念
  9. CentOS 7 安装python3.6.1
  10. urlparse获取url后面的参数