CF732F Tourist Reform(dfs树、边双连通图、tarjan)

因为知道了算法tag,所以想到了正解:

先给出两个性质:

  1. 边双给边定向一定可以转为强连通图,此为最优解
  2. 树给边定向后R的最小值必为0

性质2证明如下:

设树有n个节点,
若R_min!=0,
则每点出度至少为1,各点出度之和至少为n,
则至少有n条边,但树只有n-1条边,矛盾

那么这道题只要在原图上把边双缩成点即可

问题是如何构造?

要解决树的构造很简单,因为树上必有一点无法到达其它节点,而我们又要令R_min最大,那么就令这个无法到达其它节点的点为 包含点的个数最多的边双 代表的点 ,把这个点当做 根节点 dfs这棵树,把树上的边(原图上的桥)定向为 son—>fa,可以保证R_min=根节点代表的边双包含点的个数

然后就是我想不到的了,边双内部要如何构造呢?

虽然我自己想了一种构造方法,但是T得十分惨烈……

然后,第二天我去学习了dfs树,发现这个问题变得很简单

这是我最后用的构造方案:

void dfs(int u){vis[u]=1;for(int i=head[u];i!=-1;i=edge_nxt[i]){int v=edge_v[i];if(edge_br[i]){add_e(edge_u[i],edge_v[i],edge_id[i]);continue;}if(!aa[edge_id[i]]) aa[edge_id[i]]=u,bb[edge_id[i]]=v;//加判断是为了防止将定好向的(fa[u],u)边再反向 if(!vis[v]) dfs(v);}
}

为什么可行?

用dfs树理解,这个构造方案就是将所有树边定向向下并将所有回边定向向上,由dfs树的性质知这一定可行

最后放上完整代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
const int N=4e5+5;
int edge_u[N<<1],edge_v[N<<1],edge_id[N<<1],edge_nxt[N<<1],edge_br[N<<1];
int n,m,head[N],cnt,a[N],b[N],aa[N],bb[N];
int dfn[N],low[N],ind,bcc[N],Bcc,bcc_sz[N];
stack<int> s;
void add_edge(int u,int v,int id){edge_u[cnt]=u;edge_v[cnt]=v;edge_id[cnt]=id;edge_nxt[cnt]=head[u];head[u]=cnt++;
}
void tarjan(int u,int fa){dfn[u]=low[u]=++ind;s.push(u);for(int i=head[u];i!=-1;i=edge_nxt[i]){int v=edge_v[i];if(!dfn[v]){tarjan(v,u);low[u]=min(low[u],low[v]);if(low[v]>dfn[u]){edge_br[i]=1;edge_br[i^1]=1;Bcc++;int k;do{k=s.top();s.pop();bcc[k]=Bcc;bcc_sz[Bcc]++;}while(k!=v);}}else{if(dfn[v]<dfn[u]&&v!=fa)low[u]=min(low[u],dfn[v]);}}//勿忘考虑u为根的情况: if(!fa){Bcc++;while(!s.empty()){bcc[s.top()]=Bcc;bcc_sz[Bcc]++;s.pop();}}
}
int e_u[N<<1],e_v[N<<1],e_id[N<<1],e_nxt[N<<1];
int hd[N],ct;
void add_e(int u,int v,int id){e_u[ct]=u;e_v[ct]=v;e_id[ct]=id;e_nxt[ct]=hd[bcc[u]];//highlighthd[bcc[u]]=ct++;//highlight
}
int num,maxn=0;
bool vis_bcc[N],vis[N];
void dfs(int u){vis[u]=1;for(int i=head[u];i!=-1;i=edge_nxt[i]){int v=edge_v[i];if(edge_br[i]){add_e(edge_u[i],edge_v[i],edge_id[i]);continue;}if(!aa[edge_id[i]]) aa[edge_id[i]]=u,bb[edge_id[i]]=v;//加判断是为了防止将定好向的(fa[u],u)边再反向 if(!vis[v]) dfs(v);}
}
void dfs2(int u,int fa){for(int i=hd[u];i!=-1;i=e_nxt[i]){int v=bcc[e_v[i]];if(v==fa) continue;aa[e_id[i]]=e_v[i],bb[e_id[i]]=e_u[i];dfs2(v,u);}
}
int main(){memset(head,-1,sizeof(head));memset(hd,-1,sizeof(hd));scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d",&a[i],&b[i]);add_edge(a[i],b[i],i);add_edge(b[i],a[i],i);}for(int i=1;i<=n;i++)if(!dfn[i]) tarjan(i,0);for(int i=1;i<=n;i++){if(!vis_bcc[bcc[i]]){dfs(i);vis_bcc[bcc[i]]=1;if(bcc_sz[bcc[i]]>maxn){maxn=bcc_sz[bcc[i]];num=bcc[i];}}}dfs2(num,0);printf("%d\n",maxn);for(int i=1;i<=m;i++){if(aa[i]&&bb[i]) printf("%d %d\n",aa[i],bb[i]);else printf("%d %d\n",a[i],b[i]);}return 0;
}  

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

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

相关文章

【归并排序】奶牛的图片(jzoj 1812)

奶牛的图片 jzoj 1812 题目大意 给你一个序列&#xff0c;你可以交换相邻的两个数 让你用最少的交换次数来使得这个序列变成形如a1,a2...n,1,2...a−1,aa1,a2...n,1,2...a-1,aa1,a2...n,1,2...a−1,a的序列 问你最少的交换次数是多少次 输入样例 5 3 5 4 2 1输出样例 2解…

YbtOJ#20237-[冲刺NOIP2020模拟赛Day10]区间均值【树状数组】

正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/1 题目大意 nnn个数字的序列&#xff0c;求有多少个区间[l,r][l,r][l,r]的平均值在[L,R][L,R][L,R]的范围内。 解题思路 如果让每个ai−xa_i-xai​−x&#xff0c;那么统计区间和大于等于111的区间数量就可以统计…

ASP.NET Core应用程序的参数配置及使用

应用程序的开发不仅仅是写代码这点事情。假设你正在开发一个能够支持多次部署的微服务&#xff0c;此时你就需要有一个合理的应用程序配置方案&#xff0c;以便在开发和生产环境中能够方便地选用不同的配置参数&#xff0c;并且能够在部署到容器服务&#xff08;比如ACS或者Kub…

“Shopee杯” e起来编程暨武汉大学2020年大学生程序设计大赛决赛(重现赛)

比赛链接 文章目录A题 A Simple Problem about election题目描述题解&#xff1a;代码&#xff1a;D题 Deploy the medical team题意&#xff1a;题解&#xff1a;代码&#xff1a;F题 Figure out the sequence题意&#xff1a;题解&#xff1a;代码A题 A Simple Problem about…

Kruskal重构树

建树 模仿kruskal的过程&#xff0c;先将边权排序 依次遍历每条边 若该边连接的两个节点u和v不在一个并查集内 就新建一个结点node 该点点权为这条边的边权 找到u&#xff0c;v所在并查集的根 fufufu,fvfvfv 连边(node,fu)(n o d e , fu )(node,fu) (node,fv)( n o d e , f…

【斜率优化】玩具装箱(luogu 3195)

玩具装箱 luogu 3195 题目大意 有n件物品&#xff0c;每件物品有相对的长度CiC_iCi​现在要把这n件物品放到容器中&#xff0c;切放的物品必须是连续的&#xff0c;若把第i件物品到第j件物品放到一个容器中&#xff0c;那此容器的长度定义为xj−i∑kijCixj−i\sum_{ki}^{j} …

P5895-[IOI2013]dreaming梦想【树的直径,结论】

正题 题目链接:https://www.luogu.com.cn/problem/P5895 题目大意 nnn个点的一个森林&#xff0c;加入若干条长度为LLL的边使它变成一个树&#xff0c;求这棵树的最小直径。 解题思路 显然最优情况一定是以某个节点作为中间展开的一个菊花图&#xff08;每棵树看做一个点&…

RabbitMQ一个简单可靠的方案(.Net Core实现)

前言最近需要使用到消息队列相关技术&#xff0c;于是重新接触RabbitMQ。其中遇到了不少可靠性方面的问题&#xff0c;归纳了一下&#xff0c;大概有以下几种&#xff1a;1. 临时异常&#xff0c;如数据库网络闪断、http请求临时失效等&#xff1b;2. 时序异常&#xff0c;如A任…

CF1120D Power Tree(树形DP/构造+差分+最小生成树)

解法一&#xff1a;树形DP 个人觉得这个方法是比较可能想到的&#xff0c;但是输出方案很恶心 先转换题意&#xff1a;“无论怎样规定叶子的初始点权&#xff0c;都可以通过操作你选择的点来让所有叶子的点权清空”意味着每个叶子节点都可以通过一系列操作单独1、-1 模拟一下…

牛牛染颜色

链接&#xff1a; 文章目录题目描述题意&#xff1a;题解&#xff1a;核心代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld题目描述 牛牛最近得到了一颗树&#xff0…

【数学期望】【LCA】【树形DP】树

树 题目大意 给你一棵有n个节点的树&#xff0c;以及m个询问&#xff0c;每个询问需要你回答一个点到另一个点要经过的期望边数 输入样例 4 2 1 2 2 3 3 4 1 4 3 4输出样例 9 5 数据范围 对于 20%20\%20%的数据,N⩽10.N \leqslant 10.N⩽10. 对于 40%40\%40%的数据,N⩽10…

P3768-简单的数学题【莫比乌斯反演,杜教筛】

正题 题目链接:https://www.luogu.com.cn/problem/P3768 题目大意 给出n,pn,pn,p求∑i1n∑j1ngcd(i,j)∗i∗j\sum_{i1}^n\sum_{j1}^ngcd(i,j)*i*ji1∑n​j1∑n​gcd(i,j)∗i∗j模ppp的值。 解题思路 下文中定义Hy(x)∑i1xiyH_y(x)\sum_{i1}^xi^yHy​(x)∑i1x​iy 首先显然是…

.netcore consul实现服务注册与发现-单节点部署

一、Consul的基础介绍Consul是HashiCorp公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案&#xff0c;比如 Airbnb的SmartStack等相比&#xff0c;Consul的方案更“一站式”&#xff0c;内置了服务注册与发现框 架、分布一…

MST(最小生成树)上的确定性和存在性问题

题目1&#xff1a; 给定一个n个点m条边的连通图&#xff0c;保证没有自环和重边。对于每条边求出,在其他边权值不变的情况下,它能取的最大权值&#xff0c;使得这条边在连通图的所有最小生成树上。假如最大权值为无限大&#xff0c;则输出-1。 题解&#xff1a; 先求出图的一…

牛客网 【每日一题】[SCOI2009]粉刷匠

链接&#xff1a; 题目描述 windy有 N 条木板需要被粉刷。 每条木板被分为 M 个格子。 每个格子要被刷成红色或蓝色。 windy每次粉刷&#xff0c;只能选择一条木板上一段连续的格子&#xff0c;然后涂上一种颜色。 每个格子最多只能被粉刷一次。 如果windy只能粉刷 T 次&#…

CF932E-Team Work【斯特林数,组合数学】

正题 题目链接:https://www.luogu.com.cn/problem/CF932E 题目大意 给出n,kn,kn,k&#xff0c;求∑i1nC(n,i)∗ik\sum_{i1}^nC(n,i)*i^ki1∑n​C(n,i)∗ik 解题思路 上式子的话&#xff0c;大体是先拆开iki^kik变成∑i1n(ni)∑j0k{kj}(ij)j!\sum_{i1}^n\binom{n}{i}\sum_{j0…

【数学】异或

异或 题目大意 问你不小于nnn的数对(a,b)(a,b)(a,b)&#xff0c;有多少个满足gcd(a,b)a⊕bgcd(a,b)a \oplus bgcd(a,b)a⊕b 输入样例#1 12输出样例#1 8输入样例#2 123456输出样例#2 214394数据范围 测试点数据规模110210031000450005100006100000750000081000000950000…

分布式事务解决方案以及 .Net Core 下的实现(上)

数据一致性是构建业务系统需要考虑的重要问题 &#xff0c; 以往我们是依靠数据库来保证数据的一致性。但是在微服务架构以及分布式环境下实现数据一致性是一个很有挑战的的问题。最近在研究分布式事物&#xff0c;分布式的解决方案有很多解决方案&#xff0c;也让我在研究的同…

[AGC014D] Black and White Tree(树形DP,博弈)

每次找到所有叶子节点&#xff0c;把它们的父亲染白&#xff0c;自己染黑。这个时候染完的叶子节点及其父亲节点对树的其他部分已无影响 ,可以直接删掉。 那么只需要判断树的其他部分是否有先手必胜策略即可。用递归遍历。 边界条件&#xff1a;若树为单一节点先手必胜。 代…

【每日一题】5月7日题目精讲 「火」皇家烈焰

链接&#xff1a; 「火」皇家烈焰 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 帕秋莉掌握了一种火属性魔法 由于钟爱扫…