2019ccpc秦皇岛/Gym102361 F Forest Program 仙人掌上dfs
题意:
某地沙漠化严重,沙漠里长了很多仙人掌,现在要让你删掉仙人掌的一些边让它的所有连通分量都是树,就完成了沙漠绿化(什么鬼逻辑?)让你计算删边的方案数。
仙人掌是一种特殊的图,它的每一条边只属于1或0条回路。
题解:
画几个仙人掌就能明白,仙人掌就是一棵树上的某些点长出了回路,可以把仙人掌分成若干个回路和不属于回路的边,要把仙人掌删成树不难,每个回路至少删掉一条边,即减掉一种所有回路边都不删的的方案,所有非回路边删或不删均可,假设非回路边有$a_0$个,第i个回路有$a_i$条边$(i=1,2....n)$,容易得出方案数是$2^{a_0}*\prod _{i=1}^{n} 2^{a_i}-1$
难点在于怎样找出仙人掌的所有回路,一种方法是dfs,记录边的深度,一旦从深度高的边dfs到了深度低的边,即找到了一个环,dfs过程中有如下几种情况:
1,dfs到了父亲,不用管,直接continue
2,dfs到了深度比自己浅的点,就是找到了环,环边数为两点深度之差+1,如下图从5到1

3,dfs到了 比自己深度深的点,则是访问到了统计过的环,也不管
4,dfs到了未标记深度的点,将此点深度记为父节点深度+1并从此点开始dfs
此题坑点在于图未必是连通图,需要从每一个未标记深度的点开始dfs
#include<iostream>
#include<vector>
#include<cstring>
#define MOD 998244353
#define LL long long
using namespace std;
LL qpow(LL base,int n){
LL ans=;
while(n){
if(n&)ans=ans*base%MOD;
base=base*base%MOD;
n>>=;
}
return ans;
}
int vis[];
//0代表没访问过 1代表访问过 2代表访问过且已作为环找到过
int depth[];
vector<int> edge[];
vector<int> cnt;
void dfs(int u,int fa,int dpt){
int l=edge[u].size();
depth[u]=dpt;
for(int i=;i<l;i++){
int v=edge[u][i];
if(v==fa || depth[v]>dpt)continue;
//printf("u:%d %d v:%d %d\n",u,dpt,v,depth[v]);
if(depth[v]>= && depth[v]<depth[u]){
cnt.push_back(depth[u]-depth[v]+);
//printf("Bingo%d\n",dpt-depth[v]+1);
//depth[u]=dpt;
}else{
//depth[u]=dpt;
//vis[u]=1;
dfs(v,u,dpt+);
} }
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=;i<=m;i++){
int a,b;
scanf("%d %d",&a,&b);
edge[a].push_back(b);
edge[b].push_back(a);
}
memset(depth,-,sizeof depth);
// dfs(1,-1,0);
for(int i=;i<=n;i++){
if(depth[i]==-)dfs(i,-,);
}
int sz=cnt.size();
long long ans=;
for(int i=;i<sz;i++){
//printf("%d\n",cnt[i]);
ans=ans*(qpow(,cnt[i])-)%MOD;
m-=cnt[i];
}
ans=ans*qpow(,m)%MOD;
printf("%lld\n",ans);
return ;
}
2019ccpc秦皇岛/Gym102361 F Forest Program 仙人掌上dfs的更多相关文章
- HDU6736 2019CCPC秦皇岛赛区 F. Forest Program
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6736思路:dfs+栈 判环 设图中环的大小分别为 c1, c2, ..., ck,不属 ...
- 2019CCPC秦皇岛 F Forest Program
队友过的:https://blog.csdn.net/liufengwei1/article/details/101632506 Forest Program Time Limit: 2000/100 ...
- [CCPC2019秦皇岛] F. Forest Program
[CCPC2019秦皇岛 F] Link https://codeforces.com/gym/102361/problem/F Description 给定一个仙人掌,删去一些边可以让它变成一个森林 ...
- 2019ccpc秦皇岛/Gym102361 I - Invoker dp
题意: 连续3个特定的按键(在这3个中不要求顺序)能使出某个技能,使出不同技能所需要的按键可以重叠,给你一个技能序列,问你最少花费多少次按键能按顺序使出这些招数. 题解: dp,dp[i][j]代表使 ...
- 2019ccpc秦皇岛/Gym102361 D - Decimal 签到
题意: 给定n,判断1/n是否在十进制下无限循环 题解:判断n的是否包含除2,5以外的因数即可 #include<iostream> #include<cstdio> #inc ...
- HDU - 6736 F - Forest Program
题意 给你n个点m条边,并且保证整个图是仙人掌. 仙人掌:每条边仅属于1条或者0条回路 且无重边和自环 让你删掉一些边使其变成一棵树(拥有点数-1条边) 注意一个点也是森林 图可能是不联通的 思路 考 ...
- 2019 China Collegiate Programming Contest Qinhuangdao Onsite F. Forest Program(DFS计算图中所有环的长度)
题目链接:https://codeforces.com/gym/102361/problem/F 题意 有 \(n\) 个点和 \(m\) 条边,每条边属于 \(0\) 或 \(1\) 个环,问去掉一 ...
- 2019-ccpc秦皇岛现场赛
https://www.cnblogs.com/31415926535x/p/11625462.html 昨天和队友模拟了下今年秦皇岛的区域赛,,,(我全程在演 题目链接 D - Decimal 签到 ...
- luogu 2478 [SDOI2010]城市规划 仙人掌上dp.
LINK:城市规划 以前ls 让写的时候由于看不懂题目+以为在图中的环上dp非常困难所以放弃治疗了. 现在终于能把题目看懂了 泪目... 题目其实就是在说 给出一张图这个有一个非常好的性质 满足每个点 ...
随机推荐
- [CSP-S模拟测试]:Read(数学)
题目描述 热爱看书的你有$N$本书,第$i$本书的种类为$A[i]$.你希望每天能够看一本书,但是不希望连续两天看种类相同的书.为了达成这个条件,你需要选择一些书不看,作为一个好学生,你希望不看的书尽 ...
- python删除列表中得重复得数据
解决思想:将列表转换为 集合,利用集合删除重复数据得特性删除重复数据,然后将集合转换为列表 #删除列表中得重复元素 def delect_1 (lt): s = set(lt) lt = list(s ...
- flask-路转换器
from flask import Flask, render_template from werkzeug.routing import BaseConverter # 配置regex路由转换器 # ...
- 出席分布式事务Seata 1.0.0 GA典礼
前言 图中那个红衣服的就是本人 什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上. 简单的说,就是一次大的操作由不同的小 ...
- XAMPP【phpmyadmin】外网访问被拒绝解决办法
问题场景: 在阿里云搭建一个apache服务器,正常访问XAMPP目录下的页面. 服务器本地是可以正常访问的 但是远程 就不可以访问了: 出现这样的画面: 解决方法 1.按照提示找到httpd-xam ...
- js的几个特殊的运算符略解
js运算符的一些特殊应用及使用技巧. 1. 是否包含指定字符: ~ ~"str1".indexOf("str2") 含义为:str1 被查找的字符串 str2 ...
- python+selenium+chromewebdriver或Firefox的环境搭建
插件下载地址 chromewebdriver:https://chromedriver.storage.googleapis.com/index.html?path=2.26/放置在python下的S ...
- Cocos2d-x中使用的数据容器类
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 在计算机的数据结构中,有着数组,链表,堆栈,队列,树,图,哈希表等一些结构.在面向对象的语言中,这些结构被封装成了特定的类,而这些类就是容 ...
- Redis 系列(04-2)Redis原理 - 内存回收
目录 Redis 系列(04-2)Redis原理 - 内存回收 Redis 系列目录 1. 过期策略 1.1 定时过期(主动淘汰) 1.2 惰性过期(被动淘汰) 1.3 定期过期 2. 淘汰策略 2. ...
- 如何判断索引是否生效--explain
explain 显示了MySql 如何使用索引来处理select语句以及连接表. 使用方式在select 前面加上 explain就可以了 示例:explain select id , name ta ...