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 每乙個單鏈...