題意:給你n個村莊的座標,然後再給你m行,每行的兩個數字代表公路兩端的村莊編號(1~n),問在花費最少的情況下還需建哪些路才能使所有村莊連通。
思路:kruskal的話思路很明確,先建好邊集,然後將每條已經建好的路執行合併操作,即add(a,b);
,然後再用kruskal輸出一遍每次建邊的兩個村莊編號就ok。prim的話,沒想到該怎麼寫,網上很多題解都是用的prim。
疑問:之前把村莊編號從0~n-1開始記,輸出時再+1,但是一直wa,沒找到原因,之後換了從1~n的編號,就奇蹟過了。還有乙個re的問題,就是如果main裡面寫成下面這樣,然後把solve裡的scanf("%d",&n);
刪掉,會報re,
while(~scanf("%d",&n))
ac**:
//
// main.cpp
// l
//// created by lucienshui on 2017/5/11.
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define memset(a,b) memset(a,b,sizeof(a))
#define ull unsigned long long
using
namespace
std;
const
int maxn = 807;
int m,n,pre[maxn],height[maxn],cnt;
struct node[maxn];
struct edge
}edge[maxn*maxn];
int find(int x)
return x;
}void add(int i, int j)
return ;
}void kruskal()
}return ;
}inline
int calc(int a, int b)
void solve()
for(int i=0 ; i<=n ; i++)
cnt = 0;
for(int i=1 ; i<=n ; i++) }}
scanf("%d",&m);
for(int i=1,a,b ; i<=m ; i++)
}kruskal();
}int main()
POJ1751 Highways 最小生成樹
題意 給你n個城市的座標,城市之間存在公路,但是由於其中一些道路損壞了,需要維修,維修的費用與公路長成正比 公路是直的 但現有m條公路是完整的,不需要維修,下面有m行,表示不需要維修的道路兩端的城市,問最短費用。思路 lowcost i 陣列存還未處理的城市i離已經處理過的城市的最短距離,pre i...
poj 2485 Highways 最小生成樹
題目大意 給出1 n的城鎮,現在需要修一條高速公路,使得任意城鎮可以互相來往 轉換之後就成了求最小生成樹中最長的邊 解題思路 input的是鄰接矩陣,直接用 prim 演算法 include include define max 501 define inf 0x3f3f3f3f int t,n,n...
poj2458 Highways 最小生成樹模版
題目 最小生成樹演算法 prim演算法講得好 這篇kruskal演算法講得更清楚 1 prim演算法 1 輸入 乙個加權連通圖,其中頂點集合為v,邊集合為e 2 初始化 vnew 其中x為集合v中的任一節點 起始點 enew 為空 3 重複下列操作,直到vnew v a.在集合e中選取權值最小的邊,...