题目链接
灌溉
到了旱季农业生产的灌溉就成了一个大问题。为了保证灌溉的顺利,某县政府决定投资为各个村之间建立灌溉管道。
输入第1行包括一个整数N,表示某县的村庄的数量。(3≤N≤100),第2行-结尾为一个N×N的矩阵,表示每个村庄之间的距离。虽然在理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们限制在80个字符,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为不会有线路从第i个村到它本身(任何两个村之间的距离都不大于100000)。
输出只有一个,为修建灌溉管道将所有村庄相连在一个灌溉系统里所需的最小管道长度。
样例输入复制
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
样例输出复制
28
思路:最小生成树
代码:
#include<iostream>
#include<cstdio>
#include<string.h>
#define in(x) scanf("%d",&x)
#define out(x) printf("%d",x)
using namespace std;
const int maxn=200,max1=999999;
bool vis[maxn];
int dis[maxn]={0},graph[maxn][maxn]={0},n;
int prim(int start)
{
int i,j,now,sum=0;
for(i=1;i<=n;i++){//初始化
dis[i]=max1;
vis[i]=false;
}
for(i=1;i<=n;i++){//从1到各个点的距离
dis[i]=graph[1][i];
}
dis[1]=0;
vis[1]=true;
for(i=1;i<=n;i++){
now=max1;
int min1=max1;
for(j=1;j<=n;j++){//寻找最小边
if(vis[j]==false&&dis[j]<min1){
now=j;
min1=dis[j];
}
}
if(now==max1){
break;//如果不成图
}
vis[now]=true;
sum+=min1;
for(j=1;j<=n;j++){
if(vis[j]==false&&dis[j]>graph[now][j]){
dis[j]=graph[now][j];
}
}
}
return sum;
}
int main()
{
in(n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&graph[i][j]);
}
}
printf("%d",prim(1));
}