![](/img/trans.png)
[英]How do I use BFS to find all shortest paths between two vertices in a graph in C?
[英]How to represent graph with million vertices in C?
我有大小為1000x1000的圖形,所以有一百萬個頂點。 從每個頂點我都可以向下或向右走,因此幾乎每個頂點都有兩個邊,每個頂點都有一個數。
我必須在該圖中找到最大的路徑,但是我不知道如何表示它。 我嘗試過矩陣,但是我想它太大了,因為如果我有int array[1000][1000]
,我的程序將停止工作。 在Pascal中,我看到了數組[1..1000][1..1000]
,但是在C中,它不起作用。
編輯:謝謝,我忘了在所有數組上使用動態分配。 那解決了問題。 :)
EDIT2:現在還有另一個問題:/當我使用100x100頂點時,我的程序正在運行,但是當我使用1000x1000頂點時,while程序將掉下來。 這是代碼的選定部分,不起作用。 嘗試改變n = 1000; m = 1000; 到n = 100; m = 100; 並且程序將持續到最后。
#include<stdio.h>
#include<stdint.h>
int main()
{
int64_t i,j,n,m,cukriky = 0,q = 0;
n = 1000;
m = 1000;
int (*hall)[m],(*matrix)[m*n],(*d)[m*n];
hall = (int (*)[m])malloc(n * m * sizeof(int));
matrix = (int (*)[m*n])malloc(n*m * n*m * sizeof(int));
d = (int (*)[m*n])malloc(n*m * n*m * sizeof(int));
//while((c = getchar())!= '\n');
for(i = 0; i < n; i++){
for(j = 0; j < m; j++){
hall[i][j] = -i;}
}
/*for(i = 0; i < n*m; i++){
for(j = 0; j < n*m; j++)
matica[i][j] = 0;
}*/
matrix[0][1] = hall[0][0]+hall[0][1];
matrix[0][m] = hall[0][0]+hall[1][0];
for(i = 2; i < m*n; i++){
if(i % m != 0){
matrix[i-1][i] = hall[q][i%m];
printf("A %lld %lld matrix[%lld][%lld],hall[%lld][%lld], %d %d\n",i,m,i-1,i,q,i%m, matrix[i-1][i],hall[q][i%m]);
}
if(i+m-1 < m*n){
matrix[i-1][i+m-1] = hall[q+1][(i-1)%m];
printf("B %lld %lld matrix[%lld][%lld],hall[%lld][%lld], %d %d\n",i,m,i-1,i+m-1,q+1,(i-1)%m, matrix[i-1][i+m-1],hall[q+1][(i-1)%m]);
}
if(i % (m) == 0)
q++;
}
printf("A");
}
似乎不存在矩陣[347] 0。
如果圖形中的大多數整數均為零,則可以使用稀疏矩陣表示圖形。
在數值分析中,稀疏矩陣是其中大多數元素為零的矩陣。 相反,如果大多數元素都不為零,則矩陣被認為是密集的。 零元素占矩陣元素總數的比例稱為稀疏度(密度)。
在這里閱讀更多
您應該使用一個鄰接表 ,其中僅存儲每個節點的鄰居。 由於您的圖是稀疏的,因此鄰接表將比完整的鄰接矩陣占用更少的內存。
根據您要處理的問題的結構,您甚至可以提出一個更“聰明”的編碼(感謝@M Oehm的評論)。 但是,了解各種表示圖的方法是一個好主意。 鄰接矩陣僅適用於密集圖。 否則,請使用其他編碼,以節省空間。
我嘗試過矩陣,但是我想它太大了,因為我的程序將停止工作
您應該始終使用malloc動態分配大量數據。
所有台式機操作系統的工作方式都是這樣的:每個進程(您的程序)都具有一定數量的靜態內存( .data
和.bss
)和堆棧( .stack
)。 靜態數據是全局變量/靜態變量所在的位置。 堆棧是所有本地(自動)變量所在的位置。
靜態內存和堆棧都相對較小,我們談論的是千字節而不是兆字節。 如果您分配太多的靜態變量或太多的自動變量,您的進程將用光內存。
因此,所有大塊內存(如矩陣)都需要在堆上分配,這是通過動態分配來完成的。 不一定是因為您在運行時不知道矩陣的大小,而是因為在堆上分配的內存沒有大小限制,並且在計算機上的所有進程之間共享。 上限是操作系統或計算機的物理RAM。
(它在Pascal中工作的原因可能是因為您正在使用Object Pascal / Delphi,它可能會為您分配堆上的數據。例如,由於上述原因,整個Delphi VCL庫僅使用動態分配。)
如果您擁有具有多個內核的GPU,則即使在復雜性更高的情況下也可以正常工作。請參閱Nvidia CUDA C編程指南,並閱讀有關LAPCK和BLAZE-LIB的信息,以更好地處理頂點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.