题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=6736

题意:

在给定图中寻找所有最小环

保证不存在一条边经过两个简单环

数据范围:

$1\leq n \leq 300 000$

$1\leq m \leq 500 000$

分析:

每次遍历到某个点时入栈,遍历结束时出栈

依次把点加入栈中,如果下一个点在栈中,那么这里肯定构成了一个简单环

只需要计算栈中到达下一点元素的数量就行,不需要出栈

比赛的时候没想到这个方法,队友给出正确思路,但是实现时没写好,背锅

AC代码:

#include<bits/stdc++.h>
#define ll long long
#define pic pair<int,char>
using namespace std;
const int maxn=3e5+7;
const int mod= 998244353;
vector<int>ve[maxn];
int ins[maxn],top,sk[maxn],n,m,vis[maxn];
ll ans=1;
ll qpow(int a,int b){
ll res=1,k=a;
while(b){
if(b&1)res=res*k%mod;
k=k*k%mod;
b/=2;
}
return res;
}
void dfs(int x,int f){
sk[++top]=x;
ins[x]=1;
vis[x]=1;
for(int i=0;i<ve[x].size();i++){
int v=ve[x][i];
if(vis[v]==0){
dfs(v,x);
}else if(v!=f&&ins[v]){
int res=1;
int zz=top;
while(1){
zz--;
res++;
// cout<<zz<<endl;
if(sk[zz]==v)break;
}
if(res){
// cout<<res<<endl;
m-=res;
ans=(qpow(2,res)-1+mod)%mod*ans%mod;
}
}
}
ins[sk[top]]=0;
--top;
}
int main(){
// cout<<qpow(2,10)<<endl;
while(scanf("%d %d",&n,&m)==2){ for(int i=1;i<=n;i++)ve[i].clear();
top=0;
memset(ins,0,sizeof(ins));
memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++){
int a,b;
scanf("%d %d",&a,&b);
ve[a].push_back(b);
ve[b].push_back(a);
}
for(int i=1;i<=n;i++){
if(vis[i]==0){
dfs(i,0);
}
} ans=qpow(2,m)*ans%mod;
printf("%lld\n",ans);
ans=1;
}
return 0;
}
/*
7 9
1 2 1 3 2 3 3 4 4 5 5 3 3 6 3 7 6 7
*/

  

hdu6736(寻找最小环)的更多相关文章

  1. 信息传递(NOIP2015)(寻找最小环。。)

    原题传送门 这是一道寻找最小环的题目. 在做的时候给每一个点染色.. 防止再做已经搜过的点(优化) v[]表示是否访问的过,以及第一次访问该点的时间. u[]表示染色.. 这道题还可以用拓补排序做. ...

  2. floyd算法之最小环问题

    最小环问题:都比较容易得到从u 到 v 经过中间某一些结点的最短路,但是我们得确保回来的时候,不能经过那些结点,这样我们就需要改一下floyd算法了 进而我们想到用Floyd算法.我们知道,Floyd ...

  3. code4511 信息传递

    寻找最小环 #include <cstdio> #include <cstring> #include <iostream> using namespace std ...

  4. Floyd —Warshall(最短路及其他用法详解)

    一.多元最短路求法 多元都求出来了,单源的肯定也能求. 思想是动态规划的思想:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设Dis(A ...

  5. floyd离散,最小环

    Description 杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....VK,V1,那么必须满足K& ...

  6. Floyd最小环

    本文转自这里 最小环:从一个点出发,经过一条简单路径回到起点成为环.图的最小环就是所有环中长度最小的. 怎样求最小环呢? 1传统的解决方法(dijkstra):        任意一个最小环环的权值, ...

  7. 2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

  8. floyd求最小环

    ;i<=n;i++) ;j<=n;j++) g[i][j]=g[j][i]=dis[i][j]=dis[j][i]=inf; ;i<=m;i++){ int u,v,w;scanf( ...

  9. 拓扑_dfs——找最小环

    今天在题库发现了一个wa了很久还没调过的题,这个题呢是2015年noip的day1t2,莫名感觉难度上升(其实水的一匹). 这道题输出是3,其实就是一个图中让你找最小环,尽管我不会找环,但是要是我的话 ...

随机推荐

  1. vue 集成 NEditor 富文本

    下载NEditor 放在  vue 项目下面 public  文件中. 安装    vue-neditor-wrap  执行命令 npm  install  vue-neditor-wrap 代码使用 ...

  2. Python实现定时执行任务的三种方式简单示例

    本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 import time,os,sched schedule = sched.scheduler ...

  3. vue的自定义指令

    点击元素之外触发函数 <template> <div v-clickoutside="clickItemOut"></div> </tem ...

  4. golang包管理工具

    软件开发中,不可避免的会使用到第三方库,因此包管理工具可以极大的方便开发者管理第三方依赖,避免掉入"依赖地狱". 作为google强大背书的golang语言,golang官方包管理 ...

  5. # URL异常检测

    (Isolation Forest无监督)这个算法是随机森林的推广. iTree树构造:随机选一个属性,再随机选该特征的一个值,对样本进行二叉划分,重复以上操作. iTree构建好了后,就可以对数据进 ...

  6. JS 百度地图 换地图主题颜色(自定义)

    JS 百度地图 换地图主题颜色(自定义) 可通过这个在线编辑得到自己想要的主题:https://developer.baidu.com/map/custom/ <div id="all ...

  7. IBM XIV

    参考:https://www.doit.com.cn/p/author/xigua 参考:http://www.doit.com.cn/p/196056.html 图片说明: IBM XIV存储系统采 ...

  8. 网页报警提示 This page includes a password or credit card input in a non-secure context. A warning has been added to the URL bar. For more information, see https://goo.gl/zmWq3m.

    This page includes a password or credit card input in a non-secure context. A warning has been added ...

  9. Codeforces 567D - One-Dimensional Battle Ships - [树状数组+二分]

    题目链接:https://codeforces.com/problemset/problem/567/D 题意: 在一个 $1 \times n$ 的网格上,初始摆放着 $k$ 只船,每只船的长度均为 ...

  10. java之spring

    Spring Spring中的基本概念1.IOC/DI对象的属性由自己创建,为正向流程,而由Spring创建,为控制反转.DI(依赖注入)为实现IOC的一种方式,通过配置文件或注解包含的依赖关系创建与 ...