问题背景
这是一个有关图论的问题。
原问题是城市里有若干户,现需要管道网来连接所有户。某些家庭之间有一个距离(也存在不相连接的,但所有的路径保证能连接所有的家庭),求最短需要总长为多长的管道才能将所有户连接起来。
抽象起来是在一个无向/有向图里面,每条线都有一个权值,求能将所有点连接起来的线的最小权值之和。
做法
这里用到了普利姆算法,就是假设一朵云,一个一个将点吞掉,但吞点的路径是权值之和最小,且能连接到所有点的n-1条边。云每吞掉一个点之前,判断最这个点与它所连接的点的距离,并找出距离最小的一个吞掉,然后继续此过程,直至所有点都在云内。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define M 0x3f3f3f3f //定义一个正无穷的数
using namespace std;
int n,s=0,map[101][101];
int res[1001],v[101]={
0};//res数组用来记录云和云能够到的点的最短距离
//v数组记录某个点是否可以访问
int n