VIJOS-P1325 桐桐的糖果计划
VIJOS-P1325 桐桐的糖果计划
JDOJ 1432 桐桐的糖果计划
https://neooj.com/oldoj/problem.php?id=1432
Description
Input
Output
Sample Input
Sample Output
void tarjan(int x)//tarjan算法模板(链式前向星)
{
z[++top]=x;
v[x]=;
inz[x]=;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(v[y]==)
tarjan(to[i]),low[x]=min(low[x],low[to[i]);
else if(inz[to[i]]==)
low[x]=min(low[x],deep[to[i]]);
}
if(deep[x]==low[x])
{
ans++;
int t;
do
{
t=z[top--];
inz[t]=;
f[ans][++f[ans][]]=t;
}while(t!=x)
}
}
说明一下,deep数组表示时间戳,即节点x被搜索的次序编号。
low数组表示x能通过其他边回到的x的祖先,标记的祖先最小的时间戳。
深搜回溯到当前节点之后,当deep[x]==low[x],以x为根的搜索子树上的所有节点为一个强连通分量。
z数组模拟数据结构栈,inz数组表示元素是否在栈中,v数组表示元素是否被搜索过。
f数组记录每一个强连通分量里元素的个数和所有元素。
好了,下面我们介绍用tarjan算法求割边。
假如low[y]>deep[x]的时候,说明y不仅不能到达x的祖先,也不能通过另外一条边直接直接直接到达x,说明它们之间的e(x,y)便是割边。
注意处理重边。
处理重边的方式有两种,依据重边有用没用而定(而有用没用依题目而定)(等于没说)
假如重边没有用,在tarjan的时候加一个参数记录它的父亲,注意是参数,当y遇到父亲节点时不拓展回去,保证重边不会被遍历。
假如重边有用,那么增加一个参数记录边的编号,y不能通过这条边访问其父亲节点,但是却可以通过重边访问x,保证重边会被遍历到。
那么好了,我们如何来判定重边?
这里要引入对偶边的判定。
位运算异或,请小伙伴们自行补习。
void tarjan(int x,int pre)
{
v[x]=true;
deep[x]=low[x]=++tot;
for(int i=head[x];i!=-;i=next[i])
{
int y=to[i];
if( (i^)==pre ) continue;
if(!deep[y])
{
tarjan(y,i);
low[x]=min(low[x],low[y]);
if(low[y]>deep[x]) //割边;
}
else low[x]=min(low[x],deep[y]);
}
}
好了我们来针对一下这道题,第一问通过刚才的讲解已经没什么难度了。
来看第二问,这里注意我们是求缩点后需要加多少条边。
这里我们需要画图理解。
缩点后的无向图会变成一棵树,统计度为2的那些双联通分量就是叶子结点(双向边)。
然后ans=(t+1)/2;
好了讲了这么多相信大家也会对这个有一定的理解,细节的实现可以自己慢慢调。下面的代码仅供参考
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 10010
using namespace std;
int n,m,num,head[maxn],low[maxn],deep[maxn],topt;
int top,z[maxn],inz[maxn],ans,sum,belong[maxn],rudu[maxn];
struct node
{
int v,pre;
}e[maxn*];
void add(int from,int to)
{
e[num].v=to;
e[num].pre=head[from];
head[from]=num++;
}
void tarjan(int x,int fa)
{
low[x]=deep[x]=++topt;
z[++top]=x;inz[x]=;
for(int i=head[x];i!=-;i=e[i].pre)
{
int v=e[i].v;
if(i==(fa^))
continue;
if(deep[v]==)
{
tarjan(v,i);
low[x]=min(low[x],low[v]);
if(low[v]>deep[x])ans++;
}
else if(inz[v])
low[x]=min(low[x],deep[v]);
}
if(low[x]==deep[x])
{
sum++;
while(x!=z[top])
{
belong[z[top]]=sum;
inz[z[top]]=;
top--;
}
belong[z[top]]=sum;
inz[z[top]]=;
top--;
}
}
int main()
{
scanf("%d%d",&n,&m);
int u,v;
memset(head,-,sizeof(head));
for(int i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
for(int i=;i<=n;i++)
if(deep[i]==)
tarjan(i,-);
printf("%d\n",ans);
ans=;
for(int u=;u<=n;u++)
for(int i=head[u];i!=-;i=e[i].pre)
{
int v=e[i].v;
if(belong[u]!=belong[v])
rudu[belong[u]]++;
}
for(int i=;i<=sum;i++)
if(rudu[i]==)
ans++;
printf("%d\n",(ans+)/);
}
VIJOS-P1325 桐桐的糖果计划的更多相关文章
- Vijos P1325桐桐的糖果计划
> P1325桐桐的糖果计划 标签:**图结构 强连通分量** 描述 桐桐很喜欢吃棒棒糖.他家处在一大堆糖果店的附近. 但是,他们家的区域经常出现塞车.塞人等情况,这导致他不得不等到塞的车或人走 ...
- 桐桐的糖果计划(vijos 1325)
背景 桐桐是一个快乐的小朋友,他生活中有许多许多好玩的事,让我们一起来看看吧…… 描述 桐桐很喜欢吃棒棒糖.他家处在一大堆糖果店的附近. 但是,他们家的区域经常出现塞车.塞人等情况,这导致他不得不等到 ...
- vijos1325 桐桐的糖果计划
Description 桐桐是一个快乐的小朋友,他生活中有许多许多好玩的事,让我们一起来看看吧-- 桐桐很喜欢吃棒棒糖.他家处在一大堆糖果店的附近. 但是,他们家的区域经常出现塞车.塞人等情况,这导致 ...
- 桐桐的贸易--WA
问题 A: 桐桐的贸易 时间限制: 1 Sec 内存限制: 64 MB提交: 15 解决: 2[提交][状态][讨论版] 题目描述 桐桐家在Allianceance城,好友ROBIN家在Horde ...
- 桐桐的数学游戏(N皇后)
题目描述 相信大家都听过经典的“八皇后”问题吧?这个游戏要求在一个8×8的棋盘上放置8个皇后,使8个皇后互相不攻击(攻击的含义是有两个皇后在同一行或同一列或同一对角线上). 桐桐对这个游戏很感兴趣,也 ...
- 【2018寒假集训 Day1】【位运算】桐桐的运输方案
桐桐的运输方案(transp) [问题描述] 桐桐有 N 件货物需要运送到目的地,它们的重量和价值分别记为: 重量:W1,W2,…,Wn: 价值:V1,V2,…,Vn: 已知某辆货车的最大载货量为 X ...
- Java实现桐桐的数学难题
桐桐的数学难题 题目描述 今天数学课上,桐桐学习了质数的知识:一个正整数如果只能被1和它本身整除,那么这个整数便是质数.桐桐就想:任意一个正整数是否都能分解成若干个质数相乘的形式呢?输入一个正整数n( ...
- Vijos P1325桐桐的糖果计划(有向图双连通分量)
/*重边不能删 不能删 不能删...*/ #include<iostream> #include<cstdio> #include<cstring> #define ...
- 【年终糖果计划】跟风领一波糖果 candy.one 领取教程
糖果领取网址(较为稳定):https://candy.one/i/1474564 用微信和QQ打开的朋友请复制到其他浏览器打开 糖果领取网址(较为稳定):https://candy.one/i/147 ...
随机推荐
- [随笔]ICPC2.0
停更半年了.瞎扯下过去,现在与未来. 一.过去 1.插叙 讲道理我应该早就写这段在博客上了,不知怎么一直忘了. 在6月拿到ICPC南昌邀请赛的Ag还是比较满意,满意的最大原因是我弱校从没拿过Ag(? ...
- 正睿暑期培训day3考试
链接 A 可以发现一个小棍的贡献是使得左右两列上的球位置互换.所以只要找出哪两个球会经过当前位置,然后swap一下就行了.. 考场上调了2.5h,依然没过样例.赛后发现忘了排序!!!!... /* * ...
- bzoj4520 K远点对
题目链接 思路 这个"\(K\)远"点对一直理解成了距离第\(K\)大的点对\(233\). 要求第\(K\)远,那么我们只要想办法求出来最远的\(K\)个点对就可以了. 用一个大 ...
- AtCoder Grand Contest 037
Preface 这篇咕了可能快一个月了吧,正好今天晚上不想做题就来补博客 现在还不去复习初赛我感觉我还是挺刚的(微笑) A - Dividing a String 考虑最好情况把每个字符串当作一个来看 ...
- thinkPHP5 添加新模块
1. 修改build.php文件 , 添加新模块 2. cmd 运行命令 php think build --config build.php
- 在ASP.Net Core 中使用枚举类而不是枚举
前言:我相信大家在编写代码时经常会遇到各种状态值,而且为了避免硬编码和代码中出现魔法数,通常我们都会定义一个枚举,来表示各种状态值,直到我看到Java中这样使用枚举,我再想C# 中可不可以这样写,今天 ...
- Flutter命令突然无响应、vscode突然无法连接到IOS模拟器
这周过来突然flutter相关命令运行都没有响应, 打开任务管理器,关闭所有dart进程即可解决
- Azure EA (3) 使用Postman访问海外Azure Billing API
<Windows Azure Platform 系列文章目录> 本文介绍的是海外版的Azure Global服务,因为跨境内境外网络,访问速度会比较慢 在开始使用Azure Billing ...
- 解决 ubuntu 开机卡死在输入密码界面 && 键盘鼠标失灵!!
近期不知安装了什么package,导致 ubuntu 开机后键盘鼠标一直没法用,刚开始以为是 ubuntu 桌面环境崩溃了,后来发现系统能显示连接到网络.时间也在运行,那应该就是键盘鼠标失灵了. 网上 ...
- spring AOP XML解析
<aop:config> 标签的解析: <bean id="loggingAspect" class="com.zhuguang.jack.aop.as ...