正题

题目链接:https://www.luogu.com.cn/problem/P7516


题目大意

懒了,直接抄题意了
对于一张 nnn 个点 mmm 条边的有向图 GGG(顶点从 1∼n1 \sim n1∼n 编号),定义函数 f(u,G)f(u, G)f(u,G):

  1. 初始化返回值 cnt=0cnt = 0cnt=0,图 G′=GG'= GG′=G。
  2. 从 111 至 nnn 按顺序枚举顶点 vvv,如果当前的图 G′;G';G′; 中,从 uuu 到 vvv 与从 vvv 到 uuu 的路径都存在,则将 cnt+1cnt + 1cnt+1,并在图 G′;G';G′; 中删去顶点 vvv 以及与它相关的边。
  3. 第 222 步结束后,返回值 cntcntcnt 即为函数值。

现在给定一张有向图 GGG,请你求出 h(G)=f(1,G)+f(2,G)+⋯+f(n,G)h(G) = f(1, G) + f(2, G) + \cdots + f(n, G)h(G)=f(1,G)+f(2,G)+⋯+f(n,G) 的值。

更进一步地,记删除(按输入顺序给出的)第 111 到 iii 条边后的图为 GiG_iGi​(1≤i≤m1 \le i \le m1≤i≤m),请你求出所有 h(Gi)h(G_i)h(Gi​) 的值。

1≤n≤103,1≤m≤2×1051\leq n\leq 10^3,1\leq m\leq 2\times 10^51≤n≤103,1≤m≤2×105


解题思路

但凡一个不按惯性思维思考的方法都可以做出这道题

这个删边就很意义不明,反过来直接改成加边就简单很多。

然后还有一个问题就是是否删点的判断也是没有必要的:

假设对于起点uuu能走到vvv,vvv不能走到uuu,那么显然并不存在一个节点xxx使得uuu能走到xxx且xxx能走到uuu并且vvv是这些路径的必经点,因为那么vvv肯定在这个环上,那么vvv显然能走到uuu。

所以现在f(u,G)f(u,G)f(u,G)能否统计vvv就变为了判断是否存在一个u→v→uu\rightarrow v\rightarrow uu→v→u的环使得路径上的所有点编号不小于min(u,v)min(u,v)min(u,v)。

那么不妨考虑一下两个点对(u,v)(u,v)(u,v)之间不断加边之后第一次产生贡献的时间,每条边的权值设为加入的时间,这个时间就是u→v→uu\rightarrow v\rightarrow uu→v→u的一条不经过编号小于min(u,v)min(u,v)min(u,v)点的情况下最大权值最小的路径。

这样Flody就有O(n3)O(n^3)O(n3)的算法了。

然后我们想了很久感觉最短路行不通,那么此时就需要摒弃惯性思维的想法了,我们考虑另一个更暴力的做法,我们每次加边然后暴力判断每个点之间的联通,发现这样的时间复杂度是O(nm2)O(nm^2)O(nm2)的。

然后依旧的我们考虑另一种可能,我们最外层不枚举加边,而是枚举需要统计答案的起点uuu,然后每次加一条边(x,y)(x,y)(x,y),如果uuu能走到xxx且不能走到yyy那么此时uuu能走到yyy了,从yyy开始bfsbfsbfs所有其他没有走过的节点,需要注意的是走过的边两边都是遍历过的所以可以直接删除。

这样的时间复杂度就是O(n(n+m))O(n(n+m))O(n(n+m)),可以通过本题。

需要卡常


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int N=1e3+10,M=2e5+10;
struct node{int to,next;
}a[M];
int n,m,f[N][N],g[N][N];
int ex[M],ey[M],ans[M];
vector<int> G[N],D[N];queue<int> q;
void bfs(int x,int s,int w){q.push(x);while(!q.empty()){int x=q.front();q.pop();f[s][x]=w;for(int i=0;i<G[x].size();i++)if(!f[s][G[x][i]])q.push(G[x][i]);G[x].clear();}return;
}
void bgs(int x,int s,int w){q.push(x);while(!q.empty()){int x=q.front();q.pop();g[s][x]=w;for(int i=0;i<D[x].size();i++)if(!g[s][D[x][i]])q.push(D[x][i]);D[x].clear();}return;
}
int main()
{scanf("%d%d",&n,&m);m++;for(int i=2;i<=m;i++)scanf("%d%d",&ex[i],&ey[i]);reverse(ex+2,ex+1+m);reverse(ey+2,ey+1+m);for(int x=1;x<=n;x++){for(int i=1;i<=n;i++)G[i].clear();for(int i=1;i<=n;i++)D[i].clear();f[x][x]=g[x][x]=1;for(int i=2;i<=m;i++){if(ex[i]<x||ey[i]<x)continue;if(f[x][ex[i]]&&!f[x][ey[i]])bfs(ey[i],x,i);else if(!f[x][ex[i]]&&!f[x][ey[i]])G[ex[i]].push_back(ey[i]);if(g[x][ey[i]]&&!g[x][ex[i]])bgs(ex[i],x,i);else if(!g[x][ey[i]]&&!g[x][ex[i]])D[ey[i]].push_back(ex[i]);}}for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)if(f[i][j]&&g[i][j])ans[max(f[i][j],g[i][j])]++;for(int i=1;i<=m;i++)ans[i]+=ans[i-1];reverse(ans+1,ans+1+m);for(int i=1;i<=m;i++)printf("%d ",ans[i]);return 0;
}

P7516-[省选联考2021A/B卷]图函数【bfs】相关推荐

  1. P7518-[省选联考2021A/B卷]宝石【主席树,二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P7518 题目大意 给出nnn个点的一棵树,每个点上有不大于mmm的数字. 然后给出一个长度为ccc的各个位数不同的 ...

  2. P7516 [省选联考 2021 A/B 卷] 图函数

    解析 纯纯的人类智慧题. 关键性质:vvv 可以在计算 f(u,G)f(u,G)f(u,G) 时产生贡献,当且仅当 GGG 中 u,vu,vu,v 之间可以通过 [v,n][v,n][v,n] 的点互 ...

  3. P7515-[省选联考 2021A卷]矩阵游戏【差分约束】

    正题 题目链接:https://www.luogu.com.cn/problem/P7515 题目大意 有一个n∗mn*mn∗m的矩形AAA,然后给出一个(n−1)∗(m−1)(n-1)*(m-1)( ...

  4. P6620 [省选联考 2020 A 卷] 组合数问题(斯特林数、下降幂)

    解析 给出 n,x,pn,x,pn,x,p 和一个 mmm 次的多项式 f(k)f(k)f(k),求解: ∑k=0nf(k)xk(nk)modp\sum_{k=0}^nf(k)x^k\binom n ...

  5. P7520-[省选联考 2021 A 卷]支配

    正题 题目链接:https://www.luogu.com.cn/problem/P7520 题目大意 给出nnn个点mmm条边的一张有向图,一号点为起始点,qqq次独立的询问加入一条边后有多少个点的 ...

  6. P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】

    正题 题目链接:https://www.luogu.com.cn/problem/P6628 题目大意 给出nnn个点的一张完全无向图,i∼ji\sim ji∼j的边权是∣i−j∣|i-j|∣i−j∣ ...

  7. P6619-[省选联考2020A/B卷]冰火战士【树状数组二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P6619 题目大意 有火系战士和冰系战士有一个温度和一个战斗力,每次加入或删除一个战士,要求一个最大的kkk使得温度 ...

  8. 省选联考 2020 A 卷

    省赛虽然炸了,但题解还是要写滴(笑) 第 200 篇 b l o g 祭 ! ! \Huge 第200篇blog祭!! 第200篇blog祭!! 组合数问题 题意简单明了 首先要看出要把多项式的每一项 ...

  9. [省选联考 2020 B 卷] 卡牌游戏 题解c++

    看到这题,真的忒简单啊! 咳咳,开个玩笑.关于这题: 题目描述 轩轩某天想到了一个卡牌游戏,游戏规则如下: 初始时轩轩的手中有自左向右排成一排的 n 张卡牌,每张卡牌上有一个整数分值. 接下来,轩轩每 ...

最新文章

  1. 用Unison+inotify实现数据的双向实时同步
  2. C++中#include<fstream>头文件
  3. Cookie的使用(js-cookie插件)
  4. Alter-有意思的小游戏
  5. EasyUI 在aspx页面显示高度不正常解决办法
  6. 第九大陆服务器未找到文件,第九大陆服务器优化规则说明 拍卖行和寄售功能关闭公告...
  7. [转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)
  8. 从0开始构建SpringCloud微服务(1)
  9. 语音识别 AI 挑战赛上线:用深度学习三种结构,对 50 种环境声音分类!
  10. php重点,php – 课程。重点是什么?
  11. eclipse maven 打war包的几种方式
  12. POJ 1190 生日蛋糕 DFS
  13. 使用github找资源
  14. PS2022新增功能简介
  15. Python使用pytesseract进行验证码图像识别
  16. 基于CWMP(TR069)协议ACS服务器的搭建
  17. 信息检索方法和步骤——怎样展开信息检索?
  18. 360插件化方案RePlugin学习笔记-插件与宿主间的通信方式
  19. 小程序和html5开发的差异
  20. Roboware Studio教程 (ROS kinetic)

热门文章

  1. Spark ML - 协同过滤
  2. aggregation java_Elasticsearch Aggregation 多个字段分组统计 Java API实现
  3. java file_java开发之File类详细使用方法介绍
  4. mobile.php discuz,电脑访问discuz手机版【触屏版跳转标准版的修改方法】
  5. matlab优化算法案例分析与应用_最优化计算与matlab实现(18)——粒子群优化算法——权重改进的粒子群算法...
  6. oracle类似isempty,NULLs和empty strings在不同数据库的中特点
  7. vscode代码运行时间工具_10款实用的VSCode插件提升你的编辑体验 | 第98期
  8. c 命令导出数据到mysql_MySQL命令行导出数据库
  9. 「offer来了」从基础到进阶原理,从vue2到vue3,48个知识点保姆级带你巩固vuejs知识体系
  10. react只停留在表层?五大知识点带你梳理进阶知识