HDU 4707 Pet 鄰接表實現

2022-05-18 14:21:18 字數 1823 閱讀 4937

解題報告:題目大意是在無向圖g中有n個點,分別從0 到n-1編號,然後在這些點之間有n-1條邊,可以保證這個圖是連通圖,並且每條邊的長度都是1,然後讓你求出從編號為0的點出發,到其它的點的距離大於d的點的個數。

這題的點的個數有500000個,而記憶體限制為32m,很顯然,開鄰接矩陣不行,但這題實際上不需要記錄邊只需要開一位陣列就可以了,但是我為了練習一下鄰接矩陣的寫法,特地用鄰接矩陣另外寫了乙個**。第一次寫鄰接矩陣,一開始忘了標記已經走過的點,造成dfs的時候陷入了死迴圈,一執行就掛了,很明顯爆棧了,找了好久,才發現原來走過的點如果不標記還會再走一遍。還有乙個很重要的點就是,每組資料結束之後,不要忘記清理記憶體,不然還是會mle。然後這題如果不用鄰接表寫的話,直接定義乙個一位陣列也行,因為題目雖然沒有說,但是實際上題目輸入的資料是有順序的,就是按照從0點開始往其它的點走的順序來輸入的,很顯然,這樣就方便多了。

鄰接表ac**:

1 #include2 #include3 #include4

using

namespace

std;

5const

int maxn = 100005;6

7struct

node8;

1213 typedef struct

node

1422

}linklist;

2324

intlength[maxn],visit[maxn];

2526

void push(linklist *link,int s,int

e)27

41 link[s].num++;42}

43void delete(node *p)

4450

51void clean(linklist *link,int

n)52

5657

void dfs(linklist *head,int l,int

deep)

5869}70

71int

main()

7285 memset(length,0,sizeof

(length));

86 memset(visit,0,sizeof

(visit));

87 dfs(link,0,0

);88

int tot = 0;89

for(int i = 1;i < n;++i)

90if(length[i] >d)

91 tot++;

92 printf("

%d\n

",tot);

93clean(link,n);94}

95return0;

96 }

view code

一維陣列ac**:

1 #include2 #include3 #include4

using

namespace

std;56

const

int maxn = 100005;7

intlen[maxn];89

intmain()

1024

int tot = 0;25

for(int i = 1;i < n;++i)

26if(len[i] >d)

27 tot++;

28 printf("

%d\n

",tot);29}

30return0;

31 }

view code

鄰接表實現

鄰接表構建 鄰接表某個頂點遍歷 以上 include include include include using namespace std class adjacencytable void setedge int s,int e,int weight void getvertexinfo int...

陣列實現鄰接表

之前我們介紹過圖的鄰接矩陣儲存法,它的空間和時間複雜度都是n 2,現在我來介紹另外一種儲存圖的方法 鄰接表,這樣空間和時間複雜度就都是m。對於稀疏圖來說,m要遠遠小於n 2。先上資料,如下 第一行兩個整數n m。n表示頂點個數 頂點編號為1 n m表示邊的條數。接下來m行表示,每行有3個數x y z...

C Dijkstra鄰接表實現

ifndef mapimplement h included define mapimplement h included include include define maxvertexnum 100 define infinity 65535 using namespace std typede...