|
|
|
@ -137,6 +137,10 @@ int res; // 最小生成树里面边的长度之和
|
|
|
|
|
|
|
|
|
|
// 普利姆算法求最小生成树
|
|
|
|
|
int prim() {
|
|
|
|
|
// 距离初始化无穷大,表示所有结点都在生成树之外
|
|
|
|
|
memset(dis, 0x3f, sizeof dis);
|
|
|
|
|
dis[1] = 0;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < n; i++) { // 迭代n次
|
|
|
|
|
/*
|
|
|
|
|
1、找到集合外,距离集合最近的点,记为t,此时有两种情况进行猴子选大王:
|
|
|
|
@ -150,7 +154,7 @@ int prim() {
|
|
|
|
|
/*2、如果不是第一个点,并且剩余的点距离集合的最小距离是INF,说明现在没有点可以连通到生成树,
|
|
|
|
|
这时不是连通图,没有最小生成树,返回INF
|
|
|
|
|
|
|
|
|
|
如果是第一个点,因为把它加到集合中去的代码是在下面进行的,此时它也没有被加入到集合中去,所以dis[t]=INF,这时不能说无解
|
|
|
|
|
如果是第一个点,因为把它加到集合中去的代码是在下面进行的,此时它也没有被加入到集合中去,所以dist[t]=INF,这时不能说无解
|
|
|
|
|
因为才刚刚开始,需要特判一下
|
|
|
|
|
*/
|
|
|
|
|
if (i && dis[t] == INF) return INF;
|
|
|
|
@ -173,8 +177,7 @@ int main() {
|
|
|
|
|
cin >> n >> m;
|
|
|
|
|
// 所有点之间的距离初始化为正无穷,然后再读入所有边
|
|
|
|
|
memset(g, 0x3f, sizeof g);
|
|
|
|
|
// 距离初始化无穷大,表示所有结点都在生成树之外
|
|
|
|
|
memset(dis, 0x3f, sizeof dis);
|
|
|
|
|
|
|
|
|
|
// 读入数据
|
|
|
|
|
while (m--) {
|
|
|
|
|
int a, b, c;
|
|
|
|
@ -211,6 +214,10 @@ int pre[N]; // 前驱结点
|
|
|
|
|
|
|
|
|
|
// 普利姆算法求最小生成树
|
|
|
|
|
int prim() {
|
|
|
|
|
memset(dis, 0x3f, sizeof dis);
|
|
|
|
|
memset(pre, -1, sizeof pre); // 记录前驱路径
|
|
|
|
|
dis[1] = 0;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < n; i++) { // 迭代n次
|
|
|
|
|
int t = -1;
|
|
|
|
|
for (int j = 1; j <= n; j++)
|
|
|
|
@ -230,8 +237,6 @@ int prim() {
|
|
|
|
|
int main() {
|
|
|
|
|
cin >> n >> m;
|
|
|
|
|
memset(g, 0x3f, sizeof g);
|
|
|
|
|
memset(dis, 0x3f, sizeof dis);
|
|
|
|
|
memset(pre, -1, sizeof pre); // 记录前驱路径
|
|
|
|
|
|
|
|
|
|
// 读入数据
|
|
|
|
|
while (m--) {
|
|
|
|
|