题目链接:

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. PHP数字转大写

    最近在研究算法,发现了一个数字转大写的算法挺有意思,分享给大家看看: function get_amount($num){        $c1 = "零壹贰叁肆伍陆柒捌玖";   ...

  2. Nginx实现同一端口HTTP跳转HTTPS

    小目标:在只监听一个端口的情况下,将http访问跳转为https. 一般情况下http协议使用80端口,https协议443端口.要实现http强制转https是非常简单的事,随便都可以找到很多方案. ...

  3. 【微信支付】公众号 JSAPI支付 HTML5(使用MUI前端框架)+WebApi 实现流程

    必要参数:      1) AppID,AppSecret : 在微信公众号后台管理—>(菜单栏)开发 —> 基本设置     2)商户号 :在微信公众号后台管理—>(菜单栏)微信支 ...

  4. JDBC 复习5 mysql 的自增长主键 auto_increment

    MySQL 自增长主键 (1)如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号.编号从1开始,并1为基数递增. (2)把0插入AUTO_INCRE ...

  5. pandas简介

  6. gin框架实现一个简单的项目 ③

    承接:gin框架封装自己的路由 ② 对于一个项目来说,需要将各个功能模块分开,也就是所谓的三层模型,这里介绍一下个人的做法: contorller主要负责路由 model主要负责程序输入输出的数据 s ...

  7. Redis 简单使用 and 连接池(python)

    Redis 简介 NoSQL(not only sql):非关系型数据库 支持 key-value,  list,  set,  zset,  hash 等数据结构的存储:支持主从数据备份,集群:支持 ...

  8. 使用的jQuery加载源的优势【问题】

    [问题]使用的jQuery加载源的优势? [答案]许多用户在访问其他站点时,已经从谷歌或微软加载过 jQuery.所有结果是,当他们访问您的站点时,会从缓存中加载 jQuery,这样可以减少加载时间. ...

  9. SAP官方提供的人脸识别API

    https://api.sap.com/api/face_detection_api/resource 准备一张克里斯蒂亚诺 - 罗纳尔多的图片: 点击Choose File按钮,加载这些图片,然后点 ...

  10. 2019 GIAC-全球互联网架构大会课件

    百度云:https://pan.baidu.com/s/1Lt40UTP3hCIVS7LhPl2bKw密码:ovrh