用陣列模擬鄰接表

2021-07-04 08:44:05 字數 1402 閱讀 8454

struct edge

edge[max*3+1];//一定要邊的範圍

int head [max];//頭節點

void init()//初始化資訊,-1;

插入邊void insert(int u,int v,__int64 len)

遍歷:for(int i=head[top];i!=-1;i=edge[i].next)

然後看題意:

有一些點,每個點都有乙個重量值,然後給出了一些邊,每個邊都有乙個權值最後讓用一些邊組成一棵樹,使得花費最少,每個邊(u,v)的花費=(邊得所有子孫節點的重量和)*(該邊的權值)對於這個花費,可以看出,對於每條邊(u,v),其花費就相當於每個在後面的結點都走了這個邊一次,那麼我們可以假想,已經形成了最優的樹,觀察這顆樹,就能發現,對於一條邊(u,v),由於邊的子女都走了這條邊一次,而且是在一棵樹中,那麼從根結點到邊的某個子女結點的路徑必然包含(u,v),其他邊同理,那麼所有邊的花費之和,就可以轉化為(從根結點到某個結點的路徑長度*結點重量)之和   那麼之後就是求最短路徑了。

注意:某些地方會超過int,所以開long long 就好了,inf的值也設的大一些。比如100億,因為最短路徑的極限資料應該是50000*2^16>2^31

**:[cpp]view plain

copy

print?

#include

#include

#include

#include

using namespace std;

const int max=50001;

typedef unsigned long long lint;

const long long  inf=999999999;

struct edge

edge[max*3+1];

int head [max];

lint weight[max];

lint  dist[max];

bool  vis[max];

lint  n;

int k=1;

void init()

void insert(int u,int v,__int64 len)

void spfa(int s)}}

}}int main()

spfa(1);

int flag=1;

lint  sum=0;

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

sum+=weight[i]*dist[i];

}if(flag)

printf("%d\n",sum);

else

printf("no answer\n");

}return 0;

}

ACM 用陣列模擬鄰接表

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

陣列模擬鄰接表

圖的鄰接矩陣儲存法,它的空間和時間複雜度都是n2,現在來介紹另外一種儲存圖的方法 鄰接表,這樣空間和時間複雜度就都是m。對於稀疏圖來說,m要遠遠小於n2。先上資料,如下。4 5 1 4 9 4 3 8 1 2 5 2 4 6 1 3 7 第一行兩個整數n m。n表示頂點個數 頂點編號為1 n m表示...

陣列模擬鄰接表儲存

鄰接矩陣看上去是個不錯的選擇,首先是容易理解,第二是索引和編排都很舒服但是我們也發現,對於邊數相對頂點較少的圖,這種結構無疑是存在對儲存空間的極大浪費。因此我們可以考慮另外一種儲存結構方式,例如把陣列與鍊錶結合一起來儲存,這種方式在圖結構也適用,我們稱為鄰接表 adjacencylist 每乙個單鏈...