思路:
比較典型的求最小生成樹,利用k演算法或者p演算法,如果在輸入時兩個村莊的修建狀態為 已修建,那麼我這裡的做法是讓他們之間的權值為 0,即修建費用為 0;然後套用演算法就好了。
**p演算法:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include**k演算法:12using
namespace
std;
13/*
集合之里:屬於mst所構成的點集 反之亦然
*/14
const
int maxn = 103;15
const
int inf = 0x3f3f3f3f; //
最大值16
int edge[maxn][maxn]; //
鄰接矩陣
17int used[maxn]; //
標記這個點是否在最小生成樹的集合裡面 0 代表未加入 1 代表加入
18int lowcost[maxn]; //
存放的是未被加入集合的 點 到 已經被加入集合的 點 的最短距離(如果集合裡面的點和 多個集合之外的點相通 就取短的那個 這個陣列伴隨著加入點的變化而時刻變化著)
19int
n;20
21int prim(int start,int maxn) //
假設 從 start 開始尋找mst, maxn 代表點的個數
2228
int sumweight = 0; //
mst 的權值
2930
for(int i = 1; i <= maxn; i++)
3141}42
if(v != -1) //
找到了 v 這個點
4352}53
}54}55
return
sumweight;56}
5758
intmain()
5973 cout << prim(1, n) <75return0;
76 }
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include12using
namespace
std;
1314
const
int maxn = 2e3+ 3;15
intpre[maxn];
16int
n;17
18int find(int
x)19
2223
structnode
24cy[103 * 103
];27
28int
mycmp(nodea,nodeb)
2932
33void
mst()
3438
39int
kru()
4051}52
return
ans;53}
5455
intmain()
5668 sort(cy + 1, cy + n * (n - 1) / 2 + 1
, mycmp);
69int ans =kru();
70 printf("
%d\n
",ans);71}
72return0;
73 }
繼續暢通工程 hdu 1879
include 2243673 2010 03 24 20 56 41 accepted 1879 375ms 320k 1070 b c 悔惜晟 include 修改了三次終於ac,為何就是 的效率不高 include include using namespace std int s 4991 ...
hdu 1879 繼續暢通工程
include include include typedef structedge edge input 5050 int cost 5050 int parent 5050 int cmp const void a,const void b int root int n int kruskal ...
HDU 1879 繼續暢通工程
和前幾個最小生成樹有點不一樣的地方就是 在kruskal裡面,要先把已經修通的路排在前面 不知道這樣是不是多此一舉呢 再按照每條路的價值從小到大排序 自定義排序規則就是 呼叫c 的sort int cmp const e a,const e b 將每條邊存在結構體edge裡面 struct e ed...