解題報告:題目大意是在無向圖g中有n個點,分別從0 到n-1編號,然後在這些點之間有n-1條邊,可以保證這個圖是連通圖,並且每條邊的長度都是1,然後讓你求出從編號為0的點出發,到其它的點的距離大於d的點的個數。
這題的點的個數有500000個,而記憶體限制為32m,很顯然,開鄰接矩陣不行,但這題實際上不需要記錄邊只需要開一位陣列就可以了,但是我為了練習一下鄰接矩陣的寫法,特地用鄰接矩陣另外寫了乙個**。第一次寫鄰接矩陣,一開始忘了標記已經走過的點,造成dfs的時候陷入了死迴圈,一執行就掛了,很明顯爆棧了,找了好久,才發現原來走過的點如果不標記還會再走一遍。還有乙個很重要的點就是,每組資料結束之後,不要忘記清理記憶體,不然還是會mle。然後這題如果不用鄰接表寫的話,直接定義乙個一位陣列也行,因為題目雖然沒有說,但是實際上題目輸入的資料是有順序的,就是按照從0點開始往其它的點走的順序來輸入的,很顯然,這樣就方便多了。
鄰接表ac**:
1 #include2 #include3 #include4view codeusing
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 }
一維陣列ac**:
1 #include2 #include3 #include4view codeusing
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 }
鄰接表實現
鄰接表構建 鄰接表某個頂點遍歷 以上 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...