poj 3013 陣列模擬鄰接表 spfa

2021-06-07 07:37:15 字數 1395 閱讀 9574

首先,自已先用陣列模擬鄰接鍊錶,以前使用模版的,現在可以不看模版自己寫了。。。

邊的資訊:

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

**:

#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;

}

poj3013 鄰接表 優先佇列 Dij

把我坑到死的題 開始開題以為是全圖連通是的最小值 以為是最小生成樹,然後敲了發現不是,看了下別人的題意,然後懂了 然後發現資料大,要用鄰接表就去學了一下鄰接表,然後又去學了下優先佇列優化的dij 這坑爹的題目我交了10幾遍,也不知道錯在 後來知道了maxint要 define maxint 1000...

陣列模擬鄰接表

圖的鄰接矩陣儲存法,它的空間和時間複雜度都是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表示...

用陣列模擬鄰接表

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 然後看題意...