文章目录

  • 题目描述
  • 解析
  • 代码

题目描述

解析

乍一看:是个水题啊!
显然如果途径存在强连通的点,路径就会变为正无穷
所以缩点加拓扑dp以及一些特判应该就可以解决了!
一交:40分。。。
然后就开始拆东墙补西墙的debug。。。
de到80之后实在无计可施,看了测试数据
最终在交了10余次后切掉了本题(泪目)
总结一下遇见的问题吧:

1.是所以超过36500的点视为相等,而不是有超过36500的点就全部认为相等!(gg:省选的亏还是没吃够啊。。。)
2.判断强连通特判的位置应该在topu的while大循环的里面而不是判断出边的地方(如果这里不像人话可以看下面的代码有注释说明),否则入度为0的强连通会统计不上
3.有自环!!!!路径也相当于正无穷!(就是这个地方卡80分一直没想到,以后要培养题里没说没有就要考虑自环、重复路径的思维)
4.在2的判断的位置,不是所有有自环的或强连通都是可以的,至少。。它得能走到n+1点啊。。。

总的来说,本题是一道考验严谨思维的题,数据出的很好,提升了本题的质量
我也要提升自己的质量!

代码

#include<bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=2e6+100;
const int M=2e6+100;
const int X=36500;
int n,m;
int cnt=-1,fi[N];
struct node{int to,nxt;
}p[M];
void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;
}
int a,b;
int zhan[N],dfs[N],low[N],col[N];
int ed,tot,tim;
int size[N];
int self[N];
void tarjan(int x){zhan[++ed]=x;dfs[x]=low[x]=++tim;for(int i=fi[x];~i;i=p[i].nxt){int u=p[i].to;if(dfs[u]==0){tarjan(u);low[x]=min(low[x],low[u]);}else if(col[u]==0) low[x]=min(low[x],low[u]);}if(low[x]==dfs[x]){col[x]=++tot;size[tot]=1;if(self[x]) self[tot]=1;while(zhan[ed]!=x){if(self[zhan[ed]]) self[tot]=1;col[zhan[ed--]]=tot;size[tot]++;}ed--;}
}
int flag,dp[N],ru[N];
void topu(){queue<int>q;for(int i=n+1;i<=tot;i++) if(ru[i]==0) q.push(i);while(!q.empty()){int now=q.front();q.pop();
//      printf("now=%d\n",now);if(self[now]&&dp[now]||dp[now]>X||(dp[now]&&size[now]!=1)){dp[now]=36501;}//刚才第二条说的就是上面的这个特判不能写在下面的A处for(int i=fi[now];~i;i=p[i].nxt){int u=p[i].to;//A处就是这里啦
//          printf("now=%d to=%d\n",now,u);dp[u]+=dp[now];if(--ru[u]==0){q.push(u);}}}
}
int ans,num,jd[N];
int main(){scanf("%d%d",&n,&m);n++;tot=n;mem(fi,-1);for(int i=1;i<=m;i++){scanf("%d%d",&a,&b);if(a==b) self[a]=1;else addline(b,a);//反向建图 }for(int i=1;i<=n;i++){if(!dfs[i]) tarjan(i);}for(int i=1;i<=n;i++){int xx=col[i];for(int j=fi[i];~j;j=p[j].nxt){int yy=col[p[j].to];if(xx!=yy){addline(xx,yy);ru[yy]++;}}}
//  for(int i=1;i<=n+1;i++) printf("i=%d col=%d size=%d\n",i,col[i],size[col[i]]);dp[col[n]]=1;topu();
//  for(int i=1;i<=n;i++) printf("i=%d dp=%d\n",i,dp[col[i]]); for(int i=n+1;i<=tot;i++){if(dp[i]>36500){flag=1,ans=36501;break;}else ans=max(ans,dp[i]);}for(int i=n+1;i<=tot;i++){if(dp[i]>=ans){num+=size[i];jd[i]=1;}}if(ans<=36500) printf("%d\n",ans);else printf("zawsze\n");printf("%d\n",num);for(int i=1;i<=n;i++){if(jd[col[i]]) printf("%d ",i);}return 0;
}
/*
3 2
3 4
4 3
*/

不止代码:路径数量(ybtoj-最小生成树)相关推荐

  1. 不止代码,职业发展黄金手册

    花了小半天时间,读完了阿里人出品的<不止代码,职业发展黄金手册>,记录下其中的诸多闪光点. 如何快速成长为技术大牛? 做的更多,做的比你主管安排给你的任务更多. 需求分析的时候更加准确,能 ...

  2. 独立路径数量与测试用例设计

    独立路径数量与测试用例设计 常用可维护性度量中提及了圈复杂度(Cyclomatic Complexity),CC通过独立路径数量来衡量代码结构的复杂性,计算方法如下: CC = E-N+2, 或 CC ...

  3. nGQL-为什么路径越长,数量越多呢,直觉是条件越严格,路径数量会越少

    问题描述: 建立一个图谱,500个节点,2000条边,使用路径查找时,发现路径越长,返回的数量越多,和直觉完全相反,出乎意料? 问题答案: 路径短到极致就是等于节点的数量,一跳的话,就等于边的数量.如 ...

  4. 格网中A点(左上角)到B点(右下角)路径数量算法

    有一个m*n的格网,一个机器人在格网左上角(A点)要到格网的右下角(B点),机器人只能向下或者向右运行一步,求所有A到B的路径数量. public int getPath(int m,int n){i ...

  5. 并非所有代码路径都返回值

    写代码时提示:并非所有代码路径都返回值 (1)函数Max()是有必要返回值的,因为这个函数的功能就是求得某种结果: (2)函数Main()是没必要返回值的,因为它没什么需要告诉调用者(操作系统)的,所 ...

  6. 不止代码:保留道路(ybtoj 最小生成树)

    文章目录 题目描述 解析 代码 thanks for reading! 题目描述 解析 其实就是修建道路 我一开始只能想到枚举g去跑最小生成树 是m^2的算法(50pts) 但是其实每次加入的边只有一 ...

  7. XJOJ - 路径数(最短路+最短路路径数量)

    题目链接:点击查看 题目大意:Euphemia到一个N*N的药草田里采药,她从左上角的格子田(第一行,第一列)出发,要到达右下角(第N行,第N列)的格子田,每次她可以走到与当前格子有边相邻的格子去,但 ...

  8. 【Trie】最长异或路径(ybtoj Trie-3/luogu 4551)

    正题 ybtoj Trie-3 luogu 4551 题目大意 给你一棵树,让你找一条路径,使这条路径的亦或值最大 解题思路 对于每个数存下到根节点的亦或值,然后拿这些数去Trie中跑最大亦或 因为相 ...

  9. SVN代码提交数量统计

    StatSVN介绍 StatSVN是一个Java写的开源代码统计程序,从statCVS移植而来,能够从Subversion版本库中取得信息,然后生成描述项目开发的各种表格和图表.比如:代码行数的时间线 ...

最新文章

  1. 四级计算机基础知识,全国计算机等级考试四级通关攻略
  2. 一个简单的时间片轮转多道程序内核代码分析
  3. leetcode529. 扫雷游戏(dfs)
  4. C语言 求sin(x)的近似值
  5. 中单引号怎么转义_在JavaScript中组合字符串的4种方法
  6. mysql 账户余额表_账户表/余额表/消费储蓄表
  7. js复制json对象
  8. c++语言中如何检测鼠标消息,c++ 如何检测全局鼠标按钮事件
  9. svn插件说明和安装
  10. 华为java面试题目,含面试题+答案
  11. php库函数是什么,PHP常用库函数
  12. 玩转群晖NAS套件系列三:Video Station安装使用保姆级教程!
  13. 悉尼大学计算机专业新生,2020年悉尼大学计算机科学专业课程设置难不难
  14. Kubernetes 健康状态检查liveness和readiness
  15. ELK (三)安装kibana
  16. 从零开始Android游戏编程(第二版) 目录
  17. c++如何保留两位小数
  18. 基音周期估计-Yin
  19. 用python玩转数据测试与作业_用python玩转数据-实验5
  20. 西电杨宗凯调研计算机学院,西安电子科技大学校长杨宗凯到网络与继续教育学院调研指导工作...

热门文章

  1. 为什么一流成功人士的闹钟都定在早晨5:57?
  2. android获取自适应高度,Android中oncreate中获得控件高度或宽度的实现方法
  3. kafka偏移量保存到mysql里_Kafka 新版消费者 API(二):提交偏移量
  4. vue从url中获取token并加入到 请求头里_BATJ都会用到的接口鉴权cookie、session 和token...
  5. srv.sys蓝屏解决补丁_Win10 补丁 KB4556799 导致部分用户蓝屏死机和网络问题
  6. php强制对齐,[强迫症福利] 使用 PHPStorm 对齐数组的键值对
  7. 一个div 上下两行_Django 实战 | 搭一个 GitHub 用户展示网站 02
  8. 用python排序算法_Python - 八大排序算法
  9. vs里面mfc是什么_最近!一大批人正在前往文安,究竟发生了什么?
  10. c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)