最小生成树
poj1258和2458都是最小生成树问题,2458是要输出最小生成树中的最长边,1258就是直接输出各边权重之和。题目背景就不介绍了。
用的一直都是prim算法,个人比较喜欢这个算法,简单又快,之前博客里有过代码了。这里主要po一下a过程中遇到的问题:
·在遇到大的数据输入输出时,要用scanf函数而不是cout;
·可以用while(~scanf(”%d”,&n))来判断有没有读进数据,如果读入数·据,scanf()会返回-2,亲测~
·注意每次寻找最小key时候,用来保存查找结果key值的变量!这个变量注意要在每次寻找之前设成一个最大值,如果不设的话保存的是上一次寻找过程中的最小key,这次寻找可能导致找不到数!
下面贴一下1258 刚刚a的题啦:
#include <iostream>
#include <string.h>
#include<stdio.h>
#define INF 100000
using namespace std;
int c,n;
int farm[100][100],vis[100];
int key[100];
int prim()
{
for(int i=0;i<n;i++)
key[i]=INF;
int m=0,ma=INF,pos;
memset(vis,0,sizeof(vis));
key[0]=0;
while(m<n){
ma=INF;
for(int i=0;i<n;i++)
if(!vis[i]&&ma>key[i])
ma=key[pos=i];
vis[pos]=1;m++;
for(int i=0;i<n;i++)
if(!vis[i]&&farm[pos][i]<key[i])
key[i]=farm[pos][i];
}
int result=0;
for(int i=0;i<n;i++)
{result+=key[i];}
return result;
}
int main()
{
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
scanf("%d",&farm[i][j]);
}
cout<<prim()<<endl;
}
return 0;
}