题意:

有一个n个点,m条边的图,没有重边、自环,且每一条边最多属于一个环路。

给出q组询问,每次询问u,v两点间的路径有多少种可能。

思路:

先看下方样例说明:

由样例说明可以得知,路径上每经过一个环,路径种数就会乘2,而且最终答案一定是2^n;

因此使用tarjan算法求出图中的环,由于题目限制,求点双联通分量和边双联通分量效果相同。因边双联通分量好写,懒惰的作者采用了它 -~_~-

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#define ll long long
#define MOD 1000000007
using namespace std;
vector<int>a[],b[];
stack<int>s;
int n,m,q,mm=,dep[],dfn[],low[],fa[],p[][],color[],times,cnt;
bool vis[],viss[];
void tarjan(int u){
int i,j,child=,v;
s.push(u);vis[u]=;
dfn[u]=low[u]=times++;
for(i=;i<a[u].size();i++){
v=a[u][i];
if(!vis[v]){
child++;fa[v]=u;
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(v!=fa[u]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
cnt++;
int count=,tmp;
while(!s.empty()){
tmp=s.top();
color[tmp]=cnt+n;
s.pop();count++;
if(tmp==u) break;
}
if(count==) color[tmp]=tmp;
}
}
void dfs(int u){
int i,v,t1,t2;t1=color[u];
viss[t1]=;vis[u]=;
for(i=;i<a[u].size();i++){
v=a[u][i];
t2=color[v];
if(viss[t2]) goto skip;
mm++;p[t2][]=t1;dep[t2]=dep[t1]+;
b[t1].push_back(t2);b[t2].push_back(t1);
skip:if(vis[v]) continue;
dfs(v);
}
return;
}
void init(){
int i,j;
for(j=;j<;j++){
for(i=;i<n+cnt;i++){
if(!b[i].size()) continue;
p[i][j]=p[p[i][j-]][j-];
}
}
}
void shrink(){
int i,j;
for(i=;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
memset(vis,,sizeof(vis));memset(viss,,sizeof(viss));
dep[color[]]=;p[color[]][]=color[];dfs();
init();
return ;
}
ll calc(int k,int to){
if(k==to) return (to>n)?:;
else return calc(p[k][],to)*((k>n)?:);
}
ll lca(int l,int r){
int i,lca,tl=l,tr=r;
if(dep[l]<dep[r]) swap(l,r);
int diff=dep[l]-dep[r];
for(i=;i<;i++){
if(diff&(<<i)) l=p[l][i];
}
if(l==r) lca=l;
else{
for(i=;i>=;i--){
if(p[l][i]!=p[r][i]){
l=p[l][i];r=p[r][i];
}
}
lca=p[l][];
}
return calc(tl,lca)*calc(tr,lca)/((lca>n)?:);
}
int main(){
int i,t1,t2;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++) color[i]=i;
for(i=;i<=m;i++){
scanf("%d%d",&t1,&t2);
a[t1].push_back(t2);a[t2].push_back(t1);
}
shrink();
scanf("%d",&q);
for(i=;i<=q;i++){
scanf("%d%d",&t1,&t2);
printf("%lld\n",lca(color[t1],color[t2])%MOD);
}
}

JZOJ 5305 C先生的更多相关文章

  1. JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)

    5305. [NOIP2017提高A组模拟8.18]C (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description ...

  2. JZOJ.5305【NOIP2017模拟8.18】C

    Description

  3. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  4. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  5. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  6. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

  7. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  8. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

  9. [jzoj]4216.【NOIP2015模拟9.12】平方和

    Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...

随机推荐

  1. Hibernate基础学习2

    Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...

  2. JZOJ 5913. 林下风气

    Description 里口福因有林下风气,带领全国各地高校掀起了一股AK风,大家都十分痴迷于AK.里口福为了打击大家的自信心,出了一道自以为十分困难的题目.里口福有一棵树,第i个节点上有点权ai,他 ...

  3. 裸机——RTC

    1. 首先晓得RTC的基本知识 RTC被划分到timer,但RTC是面向时间点的. 如果按照定时器的思路去思考,那么应该考虑 时间周期 和 计数值. RTC 不是面向时间点的,所以略有不同, 时间周期 ...

  4. BZOJ 1441: Min(裴蜀定理)

    BZOJ 1441:Min Description 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1*X1+...An*Xn>0,且S的值最小 Input 第一行给出数 ...

  5. IIS发布错误记录

    1.HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息模块 IIS Web Core 通知 BeginRequ ...

  6. 05,Python网络爬虫之三种数据解析方式

    回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据 ...

  7. 抽象类的作用之一:sdk 传递你需要的参数

    抽象类可以干什么?抽象类可以让别人必须做一件事情,比如实现一个方法. 那它有什么作用呢? 我开始也不知道啊,后来慢慢的知道了,在开发中,我知道了它是干什么的,怎么用的.比如你要写一个sdk给别人用.但 ...

  8. 以+scheduledTimerWithTimeInterval...的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么?如何解决?

    这里强调一点:在主线程中以+scheduledTimerWithTimeInterval...的方式触发的timer默认是运行在NSDefaultRunLoopMode模式下的,当滑动页面上的列表时, ...

  9. oracle集群部署相关文章

    1. Oracle数据库HA架构方案介绍:http://blog.sina.com.cn/s/blog_7273b6cc0100p0sr.html 2.Oracle 集群概念和原理

  10. 剑指Offer - 九度1390 - 矩形覆盖

    剑指Offer - 九度1390 - 矩形覆盖2014-02-05 23:27 题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形 ...