第1节 连通性强连通、割点和桥 例题

NC15707 可达性

题目:

给出一个 0 ≤ N ≤ 105 点数、0 ≤ M ≤ 105 边数的有向图,
输出一个尽可能小的点集,使得从这些点出发能够到达任意一点,如果有多个这样的集合,
输出这些集合升序排序后字典序最小的。

题解:

• 先强连通缩点,变成一个有向无环图
• 然后在所有入度为0的点集,每一个拿出编号最小的一个点
记录缩点后的入度

    for(int i=1;i<=n;i++){for(int j=head[i];j!=-1;j=edge[j].next){int u=color[i];int v=color[edge[j].v];if(u!=v)in[v]++;//记录入度 }}

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int INF = 0x3f3f3f3f;
struct node
{int v, next;
}edge[maxn];
vector<int>p;
stack <int> s;
int dfn[maxn],low[maxn];
int color[maxn],in[maxn];
int tot,block;
int head[maxn],pre[maxn];
int n,m,cnt,C,X;
bool vis[maxn];
void add(int from, int to) {edge[++cnt].v=to;edge[cnt].next=head[from];head[from]=cnt;
}
void tarjan(int u) {dfn[u]=low[u]= ++tot;vis[u]=1;s.push(u);for(int i=head[u];i!=-1;i=edge[i].next) {int v=edge[i].v;if (!dfn[v]) {tarjan(v);low[u]= min(low[u],low[v]);}else if(vis[v]) low[u]=min(low[u],dfn[v]);}if (dfn[u]==low[u]) {block++;int v;do {v=s.top();s.pop();color[v]=block;pre[block]=min(v, pre[block]);//pre保存的是同强连通分量中编号最小点 vis[v]=0;} while (v!=u);}
}int main()
{cin>>n>>m;memset(head,-1,sizeof(head));memset(pre,INF,sizeof(pre));for(int i=0;i<m;i++){int u,v;scanf("%d%d",&u,&v);add(u,v);}for(int i=1;i<=n;i++){if(!dfn[i]) tarjan(i);}if(block==1){cout <<"1"<< endl; return 0; }for(int i=1;i<=n;i++){for(int j=head[i];j!=-1;j=edge[j].next){int u=color[i];int v=color[edge[j].v];if(u!=v)in[v]++;//记录入度 }}for(int i=1;i<=block;i++){//此处已经进行完压缩,压缩后还有block个点 if(!in[i]) //如果一个点没有入度 p.push_back(pre[i]);}sort(p.begin(),p.end());cout<<p.size()<<endl;for(int i=0;i<p.size();i++) cout<<p[i]<< " ";cout<<endl;return 0;
}

NC 19960 [HAOI2006]受欢迎的牛

题目:

• 每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。
• 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。
• 你的任务是求出有多少头牛被所有的牛认为是受欢迎的。

题解:

• 强连通缩点
• 唯一的一个出度为0的强连通分量
• 如果有多个出度为0的强连通分量则无解

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int INF = 0x3f3f3f3f;
struct node
{int v, next;
}edge[maxn];
vector<int>p;
stack <int> s;
int dfn[maxn],low[maxn];
int color[maxn],in[maxn];
int tot,block;
int head[maxn],pre[maxn];
int n,m,cnt,C,X;
bool vis[maxn];
void add(int from, int to) {edge[++cnt].v=to;edge[cnt].next=head[from];head[from]=cnt;
}
void tarjan(int u) {dfn[u]=low[u]= ++tot;vis[u]=1;s.push(u);for(int i=head[u];i!=-1;i=edge[i].next) {int v=edge[i].v;if (!dfn[v]) {tarjan(v);low[u]= min(low[u],low[v]);}else if(vis[v]) low[u]=min(low[u],dfn[v]);}if (dfn[u]==low[u]) {block++;int v;do {v=s.top();s.pop();color[v]=block;pre[block]=min(v, pre[block]);//pre保存的是同强连通分量中编号最小点 vis[v]=0;} while (v!=u);}
}int main()
{cin>>n>>m;memset(head,-1,sizeof(head));memset(pre,INF,sizeof(pre));for(int i=0;i<m;i++){int u,v;scanf("%d%d",&u,&v);add(u,v);}for(int i=1;i<=n;i++){if(!dfn[i]) tarjan(i);}for(int i=1;i<=n;i++){for(int j=head[i];j!=-1;j=edge[j].next){int u=color[i];int v=color[edge[j].v];if(u!=v)in[u]++; }}for(int i=1;i<=n;i++){//此处已经进行完压缩,压缩后还有block个点 if(!in[color[i]]) //如果一个点没有入度 p.push_back(pre[i]);}//sort(p.begin(),p.end());//cout<<ans;cout<<p.size()<<endl;//for(int i=0;i<p.size();i++) cout<<p[i]<< " ";//cout<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最大乘积(记忆化搜索)

题目描述 给一段数列&#xff0c;用k个乘号分开&#xff0c;求所得最大值 n<10! 解析 这样就不用写高精啦 枚举第一个乘号的位置递归记忆化搜索即可 问题&#xff01; 一开始边界条件写了一个这个&#xff1a; if(n-st<k) return -2e15;这样使这样的情况强制非法 但…

Loj#6503-「雅礼集训 2018 Day4」Magic【分治NTT】

正题 题目链接:https://loj.ac/p/6503 题目大意 nnn张卡mmm种&#xff0c;第iii种卡有aia_iai​张&#xff0c;求所有排列中有kkk对相邻且相同的卡牌。 1≤n≤105,0≤k≤105,1≤m≤20000,∑i1main1\leq n\leq 10^5,0\leq k\leq 10^5,1\leq m\leq 20000,\sum_{i1}^ma_in1≤n≤1…

连通性(相关练习)

文章目录NC20603 [ZJOI2007]最大半连通子图题目&#xff1a;题解&#xff1a;代码&#xff1a;NC50403 嗅探器题目&#xff1a;题解&#xff1a;代码&#xff1a;NC51269 Network of Schools题目&#xff1a;题解&#xff1a;代码&#xff1a;NC106972 Cow Ski Area题目&#x…

ASP.NET Core WebAPI中使用JWT Bearer认证和授权

为什么是 JWT BearerASP.NET Core 在 Microsoft.AspNetCore.Authentication 下实现了一系列认证, 包含 Cookie, JwtBearer, OAuth, OpenIdConnect 等,Cookie 认证是一种比较常用本地认证方式, 它由浏览器自动保存并在发送请求时自动附加到请求头中, 更适用于 MVC 等纯网页系统的…

判断溢出(ybtoj-字符串)

文章目录题目描述输入格式输出格式样例输入样例输出数据范围解析注意代码题目描述 我们将给你一些数和一个数据类型&#xff0c;你需要判断&#xff0c;如果将这些数连续相乘起来&#xff0c;将会在第几个数出现溢出的情况。 输入格式 多组数据。 第一行只有一个整数&#x…

2021“MINIEYE杯”中国大学生算法设计超级联赛(8)(1002,1004,1006,1009)

前言 依旧是白嫖账号&#xff0c;只打了一些题/kk 正题 1002 Buying Snacks 题目大意 nnn个物品&#xff0c;每个可以买一次也可以不买&#xff0c;如果买需要选择1/21/21/2块钱的&#xff0c;然后也可以相邻两个一起买并且减少一块的花销&#xff0c;求恰好用掉mmm块钱的方案…

分羊(区间dp:分治与决策单调性优化)

文章目录题目描述样例输入样例输出解析代码题目描述 给你一个数列&#xff0c;分成m段&#xff0c;每段的价值为相同数对的对数 求最小价值和 样例输入 10 2 1 2 1 2 1 2 1 2 1 2 样例输出 8 解析 容易想到区间dp 定义dp[i][j]:把前i个数分成j段的最小价值 那么枚举最后一段…

网络流专题(最大流与费用流)(一)

流量网络 • 想要将一些水从S运到T&#xff0c;必须经过一些水站&#xff0c;链接水站的是管道&#xff0c;每条管道都有它的最大能容纳的水量&#xff0c;求最多S到T能流多少流量。 基本概念 • 这是一个典型的网络流模型。我们先了解网络流的有关定义和概念。 • 若有向图G(…

eShopOnContainers 看微服务 ①:总体概览

一、简介eShopOnContainers是一个简化版的基于.NET Core和Docker等技术开发的面向微服务架构的参考应用。该参考应用是一个简化版的在线商城/电子商务微服务参考示例应用。其包含基于浏览器的Web应用、基于Xamarin的Android、IOS、Windows/UWP 移动应用&#xff0c;以及服务端应…

【模板】文艺平衡树

题目链接 题目描述 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一个有序数列。 其中需要提供以下操作&#xff1a;翻转一个区间&#xff0c;例如原有序序列是 543215\ 4\ 3\ 2\ 15 4 3 2 1&#xff0c;翻转区间是 [2,4][2,4][2,4] 的话&a…

P4022-[CTSC2012]熟悉的文章【广义SAM,dp,单调队列】

正题 题目链接:https://www.luogu.com.cn/problem/P4022 题目大意 给出mmm个模板串。 然后nnn次询问给出一个串SSS要求找到一个最大的LLL使得能够将SSS超过90%90\%90%的部分拿出来分后每个串都是某个模板串的子串且长度不小于LLL。 所有输入文件长度不超过 110000011000001…

猜数(二分、线段树)

题目描述 对于一个长度为n的数列给出m个描述 每一个描述给出一个区间[a,b]的最小值的x 求从第几个描述开始矛盾 解析 本题关键是一个关于矛盾的充要条件&#xff1a; 如果存在一个最小值x&#xff0c;其所在的区间的交集&#xff08;就是它真正可以存在的区间&#xff09;是…

网络流专题(最大流与费用流)例题总结

文章目录NC 106056 poj1459 Power Network题目大意&#xff1a;题解&#xff1a;NC213817 [网络流24题]最小路径覆盖问题题目&#xff1a;题解&#xff1a;例2&#xff1a;NC213818 [网络流24题]魔术球问题题目&#xff1a;题解&#xff1a;方法2&#xff1a;NC 213820 [网络流…

FHQ Treap

FHQ Treap 主要通过 merge⁡\operatorname{merge}merge 和 spilt⁡\operatorname{spilt}spilt 两个核心操作和其他辅助函数来实现。 本文用 lcxlc_xlcx​ 表示 xxx 的左儿子&#xff0c;rcxrc_xrcx​ 表示 xxx 的右儿子&#xff0c;datxdat_xdatx​ 表示 xxx 的随机优先级 me…

从.Net框架Bug的提交到修复代码成功合并到.NET CoreFX主线

从发现.NET Framework中SmtpClient的Bug并拿出解决方案&#xff0c;然后给微软开发者社区提交Bug开始&#xff0c;总共耗时一个多月&#xff0c;对Bug修复的代码最终被采纳&#xff0c;现已合并到.NET Core Libraries (CoreFX)主线中。修复记录https://github.com/dotnet/coref…

P2469-[SDOI2010]星际竞速【费用流】

正题 题目链接:https://www.luogu.com.cn/problem/P2469 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;你每次可以选择一条s−>ts->ts−>t的路径花费AsA_sAs​的代价出发&#xff0c;而且只能从编号小的点到编号大的点走&#xff0c;求最小花费使得所有点被…

周期长度和(KMP)

文章目录题目描述解析问题总结代码题目描述 解析 我们可以看到 如果A是B的周期 那么B一定可以写成&#xff1a; A1A2A1 的形式 注意到&#xff1a;A1就是KMP中的公共前后缀 要使A最大&#xff0c;要使A1最短 也就是求最短公共前后缀 这怎么求呢&#xff1f; 我们注意到&#x…

计算几何基础-1

文章目录基本概念点与向量的运算精度问题线段&#xff0c;射线和直线点积&#xff1a;夹角叉积向量的极角旋转一个向量求三角形面积直线交点点到直线距离点在直线上的投影判断两条线段是否相交点与直线的位置关系点是否在直线左侧点是否在直线上点是否在线段上点与多边形的位置…

.net core i上 K8S(四).netcore程序的pod管理,重启策略与健康检查

目录1.pod管理2.重启策略3.健康检查4.进入容器正文上一章我们已经通过yaml文件将.netcore程序跑起来了&#xff0c;但还有一下细节问题可以分享给大家。1.pod管理1.1创建podkubectl create -f netcore-pod.yaml我们创建一个netcore-pod.yaml文件&#xff0c;内容如下&#xff1…

【模板】可持久化并查集

题目链接 题目描述 给定 nnn 个集合&#xff0c;第 iii 个集合内初始状态下只有一个数&#xff0c;为 iii。 有 mmm 次操作。操作分为 333 种&#xff1a; 1 a b 合并 a,ba,ba,b 所在集合&#xff1b; 2 k 回到第 kkk 次操作&#xff08;执行三种操作中的任意一种都记为一次…