問題 A 可達性統計

2021-09-26 04:03:42 字數 2950 閱讀 1956

題目

法一:過程:一開始我直接拿bfs跑,沒有用去重,導致乙個節點重複算了多次,使用了bitset的位運算|去重後,答案才對,bitset**好(bitset還省空間);bitset陣列類似與bool陣列,但是省空間

思路:前向星建圖,將所有的visit[u][u]初始化為1(自己和自己相連),如果乙個點u只和本身相連就dfs一下,遍歷所有與u相連的點v,visit[u]=visit[u]|visit[v] ,並一下則所有使visit[t][i]=1成立的i都能使visit[u][i]=1(因為u和v相連,所以所有和v相連的點都和u相連)到出度為0的節點(即head[u]==0)返回;

#include

#include

#include

#include

using namespace std;

struct node

e[30005];

int head[

30005]=

;int cnt=1;

bitset<

30005

>visit[

30005];

///開乙個大小為30005的位元組陣列,陣列中每個元素的長度為30005(每一位為0或1)

void

add(

int u,

int v)

; head[u]

=cnt++;}

inline

void

ini(

int n)

void

dfs(

int u)

for(

int i=head[u]

;i;i=e[i]

.next)

}int

main()

for(

register

int i=

1;i<=n;i++

)return0;

}

法二:

思路:拓撲排序一下,按逆序來遍歷節點,先初始化visit[u][u]=1,將該節點u的visit[u]與所有與其相連的節點v visit[u]|=visit[v]即可

#include

#include

#include

#include

using namespace std;

struct node

e[30005];

int head[

30005]=

;int top[

30005];

int deg[

30005];

int cnt=

1,tot=1;

bitset<

30005

>visit[

30005];

void

add(

int u,

int v)

; head[u]

=cnt++

; deg[v]++;

}void

topsort

(int n)}}

intmain()

topsort

(n);

for(

int i=tot-

1;i>=

1;i--)}

for(

int i=

1;i<=n;i++

)printf

("%d\n"

,visit[i]

.count()

);return0;

}

型別題

#include

#include

using namespace std;

const

int n=

200;

char name1[50]

,name2[50]

;char name[n+5]

[50];

struct node

e[3005];

int head[

3005]=

;int top[

3005];

int deg[

3005];

int cnt=

1,tot=1;

bitset<

305>visit[

305]

;void

add(

int u,

int v)

; head[u]

=cnt++

; deg[v]++;

}inline

void

ini(

int n)

void

dfs(

int u)

for(

int i=head[u]

;i;i=e[i]

.next)

//cout<}

intmain()

else}if

(flag==0)

flag=0;

for(

int i=

1;iif(flag==0)

//a[r][s]=-1;

add(s,r);}

}ini

(k);

for(

int i=

1;i(visit[i]

.count()

==1)dfs

(i);

for(

int i=

1;i<=m;i++)}

if(j==k) flag=1;

for(j=

1;jif(j==k) flag=1;

//cout<<"s="(flag==1)

else

}return0;

}

可達性統計

題目描述 給定一張n個點m條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量。n,m 30000。輸入第一行兩個整數n,m,接下來m行每行兩個整數x,y,表示從x到y的一條有向邊。輸出共n行,表示每個點能夠到達的點的數量。樣例輸入 複製樣例資料 10 10 3 82 3 2 55 9 5 92...

可達性統計

題目描述 給定一張n個點m條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量。輸入格式 第一行兩個整數n,m,接下來m行每行兩個整數x,y,表示從x到y的一條有向邊。輸出格式 輸出共n行,表示每個點能夠到達的點的數量。資料範圍 1 n,m 30000 輸入樣例 10 10 3 82 3 2 5...

可達性統計

給定一張n個點m條邊的有向無環圖,分別統計從每個點出發能夠到達的點的數量。輸入格式 第一行兩個整數n,m,接下來m行每行兩個整數x,y,表示從x到y的一條有向邊。輸出格式 輸出共n行,表示每個點能夠到達的點的數量。資料範圍 1 n,m 300001 n,m 30000 輸入樣例 10 10 3 82...