链接:http://codevs.cn/problem/1078/
题目描述 Description
农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了使花费最少,他想铺设最短的光纤去连接所有的农场。 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。 每两个农场间的距离不会超过100000
输入描述 Input Description
第一行: 农场的个数,N(3<=N<=100)。
第二行..结尾: 接下来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们每行限制在80个字符以内,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为线路从第i个农场到它本身的距离在本题中没有意义。
输出描述 Output Description
只有一个输出,是连接到每个农场的光纤的最小长度和。
样例输入 Sample Input
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
样例输出 Sample Output
28
算法分析:
这道题是典型的最小生成树模板题。
prim算法:
1 #include2 #include 3 4 //Prim算法求最小生成树 5 const int maxn=101; //顶点个数最大值 6 int Prim(int n,int dist[maxn],int map[maxn][maxn],int pre[maxn]) 7 //n个顶点,dist[i]表示向外延伸的最短边长,map记录图信息,pre记录连接信息 8 { 9 int total=0;10 int i,j,k;11 int min;12 bool p[maxn];//p[i]=true表示顶点i属于集合Va,反之属于集合Vb。13 14 for(i=2;i<=n;i++)//初始化15 {16 p[i]=false;17 dist[i]=map[1][i];18 pre[i]=1;19 }20 dist[1]=0; //从顶点1开始,把顶点1放入Va集合21 p[1]=true;22 23 for(i=1;i
下面是另一个版本的prim算法代码:
1 #include2 #include 3 #define MAXV 100 4 #define INF 100005 5 void prim(int **edges,int n,int v); 6 int main(int argc, char *argv[]) 7 { 8 int N,**edges; 9 int i,j;10 scanf("%d",&N);11 edges=(int **)malloc(sizeof(int*)*N);12 for(i=0;i
下面是kruskal算法实现的代码:
1 #include2 #include 3 #include 4 using namespace std; 5 6 //并查集 7 const int maxn=1010;//最大顶点个数 8 int UFSTree[maxn]; 9 void initUFSTree()//初始化并查集的数组10 {11 for(int i=0;i