首先,自已先用陣列模擬鄰接鍊錶,以前使用模版的,現在可以不看模版自己寫了。。。
邊的資訊:
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 然後看題意...