模擬賽 仙人球 tarjan縮點 倍增

2021-08-01 22:39:17 字數 1603 閱讀 3673

仙人球

cactus.cpp

題目描述

如果乙個無自環無重邊無向連通圖的任意乙個點最多屬於乙個簡單環,我們就稱之為仙人球。所謂簡單環即不經過重複的結點的環。

現在,小z有一張仙人球圖,他想知道兩個點之間不同的非複雜路徑的條數。這裡複雜路徑指的是經過某條邊至少兩次的路徑,兩條路徑不同當且僅當它們之中的邊不同。這個問題太難了,所以小z想要請教請教你。當然,為了不讓你特別尷尬,你只需要求出條數mod 1000000007的值即可

輸入格式:

第1行:兩個整數:n、m,分別代表仙人球圖的點數和邊數

第2~m+1行:每行兩個整數xi、yi,表示xi和yi之間有一條邊

第m+2行:乙個整數k,表示詢問個數

第m+3~m+k+2行:每行兩個整數ai、bi,表示小g的詢問

輸出格式:

樣例輸入

樣例輸出

10 11

1 22 3

3 41 4

3 55 6

8 68 7

7 67 9

9 10

1 23 5

6 99 2

9 39 10

4輸出k行,每行乙個整數,為ai到bi的不同的非複雜路徑的條數mod 1000000007的值。

樣例解釋

畫圖易看出詢問1、3、4、6的答案;詢問2有兩種方案:3->5和3->4->1->2->3->5,這裡應注意3->4->1->2->3->5和3->2->1->4->3->5是同一條路徑;詢問5同理。

資料範圍與約定

對於15%的資料,n、m、k≤30

對於40%的資料,n、m、k≤500

對於70%的資料,n、m、k≤2000

對於100%的資料,n、k≤100000,m≤150000,資料保證給出的是一張仙人球圖,保證每個詢問的ai≠bi。

題解:本題看似神資料結構仙人掌,其實關係不大,僅僅是借用了仙人掌的簡單性質,我們可以認為仙人掌上的簡單環對於解本題提供的難度是,從乙個點到另乙個點,若有簡單環,則從左右出發各一條,即每多乙個環,則路線數翻倍,很好理解吧,可不可以說是乘法原理qaq,然後題就是把仙人掌上的簡單環縮點,然後詢問路徑上有多少個環,最後做乙個快速冪就可以了,然而思想很簡單,我碼力好弱啊qaq,抄了std。

貼上**:

#include #include #define n 200010

using namespace std;

int head[n][2],to[n][2],next1[n][2],cnt[2],dd[n],low[n],tot,vis[n],ins[n],sta[n],top,bel[n],num;

int fa[n][22],deep[n],sum[n][22],log1[n],pow1[n];

void add(int p , int x , int y)

void tarjan(int x , int from)

if(dd[x] == low[x])

while(t != x); }}

void dfs(int x)

int cal(int x , int y)

int main()

C 仙人球的殘影

在美麗的hdu,有一名大三的同學,他的速度是眾所周知的,跑100公尺僅僅用了2秒47,在他跑步過程中會留下殘影的哎,大家很想知道他是誰了吧,他叫仙人球,既然名字這樣了,於是他的思想是單一的,他總是喜歡從一點出發,經過3次轉折 每次向右轉90 回到出發點,而且呢,他每次轉折前總是跑相同長度的路程,所以...

仙人球的殘影 HDU 2153

problem description 在美麗的hdu,有一名大三的同學,他的速度是眾所周知的,跑100公尺僅僅用了2秒47,在他跑步過程中會留下殘影的哎,大家很想知道他是誰了吧,他叫仙人球,既然名字這樣了,於是他的思想是單一的,他總是喜歡從一點出發,經過3次轉折 每次向右轉90 回到出發點,而且呢...

HDU 2153 仙人球的殘影

在美麗的hdu,有一名大三的同學,他的速度是眾所周知的,跑100公尺僅僅用了2秒47,在他跑步過程中會留下殘影的哎,大家很想知道他是誰了吧,他叫仙人球,既然名字這樣了,於是他的思想是單一的,他總是喜歡從一點出發,經過3次轉折 每次向右轉90 回到出發點,而且呢,他每次轉折前總是跑相同長度的路程,所以...