当前位置: 首页 > news >正文

受欢迎的牛

受欢迎的牛 jdoj-neooj-1076

    题目大意:给你n个点,m条单项边,求可以和所有点联通的点的个数。

    注释:n<=10,000,m<=50,000

      想法:这题也是一道tarjan裸题,让我来A掉吧!这题和爱在心中(爱在心中?猛戳)类似,只不过这题有坑... ...用panxf的模板A不掉这道题... ...为什么呢?因为n的数据范围,会MLE。但是我们发现,这道题只需要求出强连通分量之中点的个数。所以,我们可以将原本记录强连通分量的点的数组f压成一维。但是,我们不可以用邻接矩阵来存边了。同样的,我们用链式前向星,保证不会MLE。而且,我们在这里需要作出一个特判(不然会WA掉),就是如果存在一个点,这个点入度和出度都为0,最后的答案一定为0,这是显然的。下面,我们想怎样才能正确的求出个数。同样的,我们枚举出度为0的强连通分量,如果个数大于1,显然个数为0。否则,就是这个强联通分量的个数。

    最后,附上丑陋的代码... ...

 1 #include <iostream>
 2 #include <cstdio>
 3 #define N 10010
 4 #define M 50010
 5 using namespace std;
 6 int x[M],y[M];
 7 int to[M],nxt[M],head[N],mid;
 8 int z[N],deep[N],low[N],f[N];
 9 int inwhat[N],chu[N];
10 int tot,top,ans;
11 bool v[N],isv1[N],isv2[N];
12 int inz[N];
13 void add(int a,int b)//存边 
14 {
15     to[++mid]=b;
16     nxt[mid]=head[a];
17     head[a]=mid;
18 }
19 int n;
20 void tarjan(int x)//tarjan 
21 {
22     z[++top]=x;
23     v[x]=inz[x]=1;
24     low[x]=deep[x]=++tot;
25     for(int i=head[x];i;i=nxt[i])//枚举链式前向星 
26     {
27         if(!v[to[i]]) tarjan(to[i]),low[x]=min(low[x],low[to[i]]);
28         else if(inz[to[i]]) low[x]=min(low[x],deep[to[i]]);
29     }
30     if(deep[x]==low[x])
31     {
32         int t;
33         ans++;
34         do
35         {
36             t=z[top--];inz[t]=0;
37             f[ans]++;//这里不用记录强连通分量里具体的点,只需要个数即可。 
38             inwhat[t]=ans;
39         }while(t!=x);
40     }
41 }
42 int main()
43 {
44     int m;
45     scanf("%d%d",&n,&m);
46     int a,b;
47     for(int i=1;i<=m;i++)
48     {
49         scanf("%d%d",&x[i],&y[i]);
50         isv1[x[i]]=1;//出度 
51         isv2[y[i]]=1;//入度 
52         add(x[i],y[i]);
53     }
54     for(int i=1;i<=n;i++)
55     {
56         if(isv1[i]&&!v[i]) tarjan(i);//枚举整张图 
57     }
58     if(n>=2)//特判 
59     {
60         for(int i=1;i<=n;i++) if(isv1[i]==0&&isv2[i]==0)
61         {
62             printf("0\n");
63             return 0;
64         }
65     }
66     for(int i=1;i<=m;i++)
67     {
68         if(inwhat[x[i]]!=inwhat[y[i]]) chu[inwhat[x[i]]]++;
69     }
70     int cnt=0;
71     int middle=0;
72     for(int i=1;i<=ans;++i) if(chu[i]==0) cnt++,middle=i;
73     if(cnt>1)
74     {
75         printf("0\n");
76         return 0;
77     }
78     else printf("%d\n",f[middle]);//输出即可。 
79     return 0;
80 }

    小结:tarjan是一个O(n)的算法,极其经典,正在getting中。

      错误:在记录出度的时候,不是chu[x[i]]++,而是chu[inwhat[x[i]]]++。

转载于:https://www.cnblogs.com/ShuraK/p/8313248.html

相关文章:

  • appium自动化安装(一)
  • Template Method模板方法
  • UVA 10603 倒水问题
  • 程序员编程艺术第二十六章:基于给定的文档生成倒排索引(含源码下载)
  • Flume数据采集准备
  • 【Android】Menu不同菜单的使用介绍
  • python初识
  • Elasticsearch教程收集
  • 巧用Chrome格式化压缩后的js文件
  • 通过LoadBalancerClient获取所有服务列表的IP
  • HPUX Error 23 File table overflow
  • dockerfile 构建tomcat
  • 解决内存设置过大导致实例无法启动ORA-27100
  • Python输出输入
  • 给eMule设定HighID
  • 分享的文章《人生如棋》
  • 【node学习】协程
  • MQ框架的比较
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Otto开发初探——微服务依赖管理新利器
  • PAT A1092
  • Zsh 开发指南(第十四篇 文件读写)
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 基于webpack 的 vue 多页架构
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前言-如何学习区块链
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 新手搭建网站的主要流程
  • 一个SAP顾问在美国的这些年
  • 以太坊客户端Geth命令参数详解
  • 湖北分布式智能数据采集方法有哪些?
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​​​​​​​​​​​​​​Γ函数
  • ​什么是bug?bug的源头在哪里?
  • # .NET Framework中使用命名管道进行进程间通信
  • #### go map 底层结构 ####
  • (06)金属布线——为半导体注入生命的连接
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (1)虚拟机的安装与使用,linux系统安装
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @Query中countQuery的介绍
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [Android]使用Git将项目提交到GitHub