Description

Input

Output

Sample Input

10 11
1 2
2 3
3 4
1 4
3 5
5 6
8 6
8 7
7 6
7 9
9 10
6
1 2
3 5
6 9
9 2
9 3
9 10

Sample Output

2
2
2
4
4
1

Data Constraint

Hint

Solution

  • 由于“任意一个点最多只属于一个简单环”,于是我们先用 Tarjan 算法缩环为点,方便处理。

  • 之后对缩环后的图处理出倍增信息,对环所在的点打一个“1”标记(表示1的贡献)。

  • 那么倍增统计出路径上的“1”的个数 kk ,那么答案即为 2k2^k ,时间复杂度 O(NlogN)O(NlogN) 。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=100001,mo=1e9+7;
int tot,top,now;
int first[N],next[N<<1],en[N<<1];
int u[N*3/2],v[N*3/2];
int bel[N],p[N],dep[N];
int stack[N],dfn[N],low[N];
int f[N][17],g[N][17];
bool bz[N];
inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
inline int write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline void insert(int x,int y)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;
}
inline void tarjan(int x,int y)
{dfn[x]=low[x]=++now;bz[stack[++top]=x]=true;for(int i=first[x];i;i=next[i])if(en[i]!=y)if(!dfn[en[i]]){tarjan(en[i],x);low[x]=min(low[x],low[en[i]]);}elseif(bz[en[i]]) low[x]=min(low[x],dfn[en[i]]);if(dfn[x]==low[x]){g[x][0]=stack[top]!=x;do{bel[stack[top]]=x;bz[stack[top--]]=false;}while(stack[top+1]!=x);}
}
inline void dfs(int x)
{dep[x]=dep[f[x][0]]+1;for(int i=first[x];i;i=next[i])if(en[i]!=f[x][0]){f[en[i]][0]=x;dfs(en[i]);}
}
inline int lca(int x,int y)
{if(dep[x]<dep[y]) swap(x,y);int sum=0;for(int i=log2(dep[x]);i>=0;i--)if(dep[f[x][i]]>=dep[y]) sum+=g[x][i],x=f[x][i];if(x==y) return sum+g[x][0];for(int i=log2(dep[x]);i>=0;i--)if(f[x][i]!=f[y][i]) sum+=g[x][i]+g[y][i],x=f[x][i],y=f[y][i];sum+=g[x][0]+g[y][0];return sum+g[f[x][0]][0];
}
int main()
{int n=read(),m=read();for(int i=1;i<=m;i++){u[i]=read(),v[i]=read();insert(u[i],v[i]);insert(v[i],u[i]);}tarjan(1,0);memset(first,tot=0,sizeof(first));for(int i=1;i<=m;i++)if(bel[u[i]]^bel[v[i]]){insert(bel[u[i]],bel[v[i]]);insert(bel[v[i]],bel[u[i]]);}dfs(1);for(int j=1,q=log2(n);j<q;j++)for(int i=1;i<=n;i++){f[i][j]=f[f[i][j-1]][j-1];g[i][j]=g[i][j-1]+g[f[i][j-1]][j-1];}for(int i=p[0]=1;i<=n;i++) p[i]=p[i-1]*2%mo;int q=read();while(q--) write(p[lca(bel[read()],bel[read()])]),putchar('\n');return 0;
}

JZOJ 5305. 【NOIP2017提高A组模拟8.18】C相关推荐

  1. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

  2. JZOJ 5392. 【NOIP2017提高A组模拟10.5】Lucky Transformation

    Description Input Output Sample Input 7 2 2343223 4 1 2234 Sample Output 2243233 2334 Data Constrain ...

  3. JZOJ 5371. 【NOIP2017提高A组模拟9.17】组合数问题

    Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数.举个例子,将{1,2,3}拆分成2 个集合有({1},{2,3}),({2},{1,3}),({3 ...

  4. JZOJ 100047. 【NOIP2017提高A组模拟7.14】基因变异

    Description 21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野. 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能. 因此生物进化与基因的 ...

  5. JZOJ 100041. 【NOIP2017提高A组模拟7.12】列车调度

    Description Input Output Sample Input Sample1: 3 1 2 3 Sample2: 9 1 3 2 4 8 6 9 5 7 Sample Output Sa ...

  6. JZOJ 100030. 【NOIP2017提高A组模拟7.8】为了爱情

    Description Input 输入文件第一行包含一个正整数 k.之后是 k 组测试用例. 每组测试用例的第一行为一个整数 n.接下来 n 行,每行 n 个以空格隔开的数,用来 描述棋盘的初始状态 ...

  7. JZOJ 100026. 【NOIP2017提高A组模拟7.7】图

    Description 有一个n个点n条边的有向图,每条边为< i,f(i),w(i)>,意思是i指向f(i)的边权为w(i)的边,现在小A想知道,对于每个点的si和mi. si:由i出发 ...

  8. JZOJ 5402. 【NOIP2017提高A组模拟10.8】God Knows

    Description Input Output Sample Input 5 3 1 4 5 2 3 4 3 4 1 Sample Output 5 Data Constraint Solution ...

  9. JZOJ 5405. 【NOIP2017提高A组模拟10.10】Permutation

    Description 你有一个长度为n 的排列P 与一个正整数K 你可以进行如下操作若干次使得排列的字典序尽量小 对于两个满足|i-j|>=K 且|Pi-Pj| = 1 的下标i 与j,交换P ...

最新文章

  1. AWS EBS是 Elastic Block Store 的简写
  2. 《Web前端开发精品课 HTML与CSS进阶教程》——1.4 id和class
  3. 王道操作系统考研笔记——2.1.7 进程调度的时机、切换与过程、方式
  4. 鸿蒙系统定位低端市场,明年年初见!鸿蒙系统会先定位中低端,后续全面升级...
  5. C++\Python\Qt工作笔记-读取txt文件查找某行是否包含keyWord
  6. 【Spark】SparkStreaming的应用及其原理
  7. python 迭代器协议斐波那契数列
  8. C语言scanf输入a3,【C语言】04 printf和scanf函数
  9. 小猫爪:PMSM之FOC控制04-SVPWM
  10. 支付宝、京东支付场景之策略模式实战
  11. 吴恩达 深度学习 2021版 笔记
  12. Raspberry Pi 4和 Raspberry Pi 4B的区别_树莓派4B系统安装及初步配置
  13. 程序员培训学多久?学半年能做程序员吗?
  14. zblog模板 php,卢松松博客模板zblogphp版 适合seo功能强大(已支持1.6)
  15. RHEL7.3 已经GA了.
  16. 白盒测试和黑盒测试(感谢东子哥作答)
  17. android设备如何苹果,手机怎么玩:如何像安卓一样管理iPhone文件?_苹果 iPhone 5_手机生活新闻-中关村在线...
  18. 磁盘块管理器DiskBlockManager
  19. 什么是3D摄影机,与普通摄影机有什么不同?
  20. C#-linq实战003-查询-Where

热门文章

  1. 常见的几种最优化方法
  2. JavaScript调用其他函数中的变量
  3. 5.USTC生命科学医学部学生会
  4. [C++调试笔记]Main函数声明变量
  5. 云炬Android开发教程 查看android studio版本
  6. 海南师范大学计算机设计大赛证书,我校品牌VI设计作品在中国大学生计算机设计大赛海南省赛中获得一等奖...
  7. 行政区村界线_工作动态 | 龟山镇召开村级行政区域界线勘定工作暨民政业务培训会议...
  8. 怎么把网页源码家入hexo博客_一款被大厂选用的 Hexo 博客主题
  9. GRE难句典型结构2
  10. QString to const char*