农场光纤
以上是poj1258
这道题和昨天的那个题几乎一样,只是求的量不同。
我们同样用kruscal(易于编写,而且效率很高【刘汝杰原话】)。
在找边的过程中用ans将所有的边权加在一起即可。
注意,本题并没有明确的结束标志,所以用scanf的返回值判断即可。
如果结束,返回值为EOF。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct edge{
int u,v,w;
};
int n;
int cnt;
edge e[10005];
int ans;
int p[110];
int cmp(edge a,edge b){
return a.w<b.w;
}
int find(int cur){
return cur==p[cur]?cur:p[cur]=find(p[cur]);
}
void work(){
for(int i=1;i<=n;i++){
p[i]=i;
}
sort(e,e+cnt,cmp);
ans=0;
for(int i=0;i<cnt;i++){
int x=find(e[i].u),y=find(e[i].v);
if(x!=y){
p[x]=y;
ans+=e[i].w;
}
}
}
int w;
int main(){
while(scanf("%d",&n)!=EOF){
cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&w);
if(j>i){
e[cnt].u=i;
e[cnt].v=j;
e[cnt++].w=w;
}
}
}
work();
printf("%d\n",ans);
}
return 0;
}