JZOJ.5305【NOIP2017模拟8.18】C
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
题意有点问题,实际上简单路径这里指的是不经过重复边的路径。
这题Tarjan缩点,然后LCA统计两点间环的个数k,答案就是2k个路径。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define M 600010
#define N 100010
#define mo 100000007
using namespace std;
int head[N],next[M],to[M],n,m,belong[N],dfn[N],low[N],zhan[N],sigh[N],num,ti,q,top,deep[N],visit[N],up[N][];
long long ans,sum[N];
void add(int u,int v){
num++;
next[num]=head[u];
to[num]=v;
head[u]=num;
num++;
next[num]=head[v];
to[num]=u;
head[v]=num;
}
void Tarjan(int x,int fa){
zhan[++top]=x;
ti++;
dfn[x]=ti;
low[x]=ti;
for (int v,i=head[x];i;i=next[i]){
v=to[i];
if (v==fa) continue;
if (!dfn[v]){
Tarjan(v,x);
low[x]=min(low[x],low[v]);
} else low[x]=min(low[x],dfn[v]);
}
if (dfn[x]==low[x]){
do{ sigh[x]++;
belong[zhan[top]]=x;
top--;
}while(zhan[top+]!=x);
sigh[x]--;
}
}
void DFS(int x,int fa){
if (x==) up[x][]=x;
else up[x][]=fa;
for (int i=;i<=;i++)
up[x][i]=up[up[x][i-]][i-];
deep[x]=deep[fa]+;
if (sigh[x]) sum[x]=sum[fa]+;
else sum[x]=sum[fa];
for (int v,i=head[x];i;i=next[i]){
v=to[i];
if (belong[v]==belong[fa]) continue;
if (belong[v]!=belong[x])
DFS(v,x);
}
}
long long kuai(long long a,long long b){
long long ans=;
long long mi=b;
long long qwq=a;
while (mi){
if (mi&) ans=ans*qwq%mo;
qwq=qwq*qwq%mo;
mi>>=;
}
return ans;
}
int lca(int u,int v){
if (deep[u]<deep[v]) swap(u,v);
for (int i=;i>=;i--)
if (deep[v]<=deep[up[u][i]])
u=up[u][i];
if (u==v) return u;
for (int i=;i>=;i--)
if (up[u][i]!=up[v][i])
u=up[u][i],v=up[v][i];
return up[u][];
}
int main(){
scanf("%d%d",&n,&m);
num=;
for (int i=,u,v;i<=m;i++){
scanf("%d%d",&u,&v);
add(u,v);
}
for (int i=;i<=n;i++)
sigh[i]=;
ti=;
top=;
Tarjan(,);
for (int i=;i<=n;i++){
if (belong[i]!=i)
for (int v,j=head[i];j;j=next[j]){
v=to[j];
if (belong[v]!=belong[i])
add(v,belong[i]);
}
}
sum[]=;
deep[]=;
DFS(,);
scanf("%d",&q);
for (int i=,u,v,father;i<=q;i++){
ans=;
scanf("%d%d",&u,&v);
if (u==v) if (sigh[belong[u]]) {printf("1\n");continue;}else {printf("0\n");continue;}
u=belong[u],v=belong[v];
if (deep[u]<deep[v]) swap(u,v);
father=lca(u,v);
ans=sum[u]+sum[v]-*sum[father]+(sigh[father]?:);
printf("%lld\n",kuai(,ans)%mo);
}
return ;
}
神奇的代码
JZOJ.5305【NOIP2017模拟8.18】C的更多相关文章
- JZOJ.5307【NOIP2017模拟8.18】偷窃
Description
- JZOJ.5306【NOIP2017模拟8.18】棋盘游戏
Description 这个游戏上在一个无限大的棋盘上, 棋盘上只有一颗棋子在位置(x,y)(x,y>=0)棋盘的左下角是(0,0)Amphetamine每次都是第一个移动棋子,然后Amphet ...
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
- [JZOJ 5912] [NOIP2018模拟10.18] VanUSee 解题报告 (KMP+博弈)
题目链接: https://jzoj.net/senior/#contest/show/2530/2 题目: 众所周知,cqf童鞋对哲学有着深入的理解和认识,并常常将哲学思想应用在实际生活中,例如锻炼 ...
- [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)
题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...
- [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)
题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才. ...
- 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 ...
- JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)
5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...
- JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计
5230. [NOIP2017模拟A组模拟8.5]队伍统计 (File IO): input:count.in output:count.out Time Limits: 1500 ms Memory ...
随机推荐
- C# BeginInvoke和EndInvoke方法
转载自:BeginInvoke和EndInvoke方法 IDE:Visual Studio 2008 本系列教程主要包括如下内容:1. BeginInvoke和EndInvoke方法 2. Threa ...
- 为什么在c语言中使用gets函数是危险的
If you have code like this: char s[10]; gets( s ); and you type in more than 10 characters when th ...
- 取得COM对象的UUID并以string输出
IID tmp = __uuidof(ClassLibrary1::Class1); OLECHAR * buf; StringFromIID(tmp, &buf); 好像要#include ...
- 解决The markup in the document following the root element must be well-formed.
出现问题的代码: <security-constraint> <web-resource-collection> <web-resource-name>Regist ...
- php代码检查
最近写php,几个同事都是没写过c的,经常写的变量没有定义,而php没有编译,错误无法发现. 我们现在用的是NetBeans,好在其提供了语法检测,如下图,让编辑器强制显示我错误
- C语言 · 最大乘积
算法提高 最大乘积 时间限制:1.0s 内存限制:512.0MB 问题描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入格式 第一行一个数表示数据组数 每组 ...
- Scala中集合类型与java中集合类型转换
对于java中的集合元素并不能在scala中拿来就用的,需要进行相应的转换. 1. 转换规则如下 从下面可以看出,有些可以相互转换的,有些只能单向转换: scala.collection.Iterab ...
- hive表支持中文设置
默认创建表时说明中带有中文字段时会显示如下乱码信息: 解决方案: 在hive的元数据库中执行以下SQL语句,然后重新创建刚才的表即可 . ) character set utf8; ) charact ...
- Linux快速定位并且杀掉占用端口的进程
1.定位 lsof -i:8811(端口号) 2.杀掉进程 kill -9 63924
- eclipse不能自动编译生成class文件的解决办法
最近在项目项目开发过程中遇到eclipse不能自动编译生成class文件,当时很纳闷,每次修改代码后运行都是修改前的效果,没辙了,只好反编译原来的class文件,结果发现,class文件里并没有看到修 ...