标签:case 最小 cpp bsp mit 联网 排序 strong other
Description
Input
Output
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
题目意思:农场需要拉互联网来相通,给出了n个农场之间需要连通成本的邻接矩阵,求出所需要的最小成本即最小生成树。
\\\克鲁斯卡尔算法
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,sum; int k; struct node { int start;///起点 int end;///终点 int power;///权值 }edge[150*150]; int pre[150*150]; int cmp(node a,node b) { return a.power<b.power;///按权值排序 } int find(int x)///并查集找祖先 { int a;///循环法 a=x; while(pre[a]!=a) { a=pre[a]; } return a; } void merge(int x,int y,int n) { int fx =find(x); int fy =find(y); if(fx!=fy) { pre[fx]=fy; sum+=edge[n].power; } } int main() { int i,j,x; while(scanf("%d",&n)!=EOF) { if(n==0) { break; } sum=0; k=1; for(i=1;i<=n;i++)///并查集的初始化 { pre[i]=i; } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&x); edge[k].start=i; edge[k].end=j; edge[k].power=x; k++; } } k--; sort(edge+1,edge+k+1,cmp); for(i=1;i<=k;i++) { merge(edge[i].start,edge[i].end,i); } printf("%d\n",sum); } return 0; }
\\\普里姆算法
#include<stdio.h> #include<string.h> #define MAX 0x3f3f3f3f using namespace std; int logo[150*150];///用0和1来表示是否被选择过 int map1[150][150]; int dis[150*150];///记录任意一点到这一点的最近的距离 int n,m; int prim() { int i,j,now; int sum=0; for(i=1;i<=n;i++)///初始化 { dis[i]=MAX; logo[i]=0; } for(i=1;i<=n;i++) { dis[i]=map1[1][i]; } dis[1]=0; logo[1]=1; for(i=1;i<n;i++)///循环查找 { now=MAX; int min1=MAX; for(j=1;j<=n;j++) { if(logo[j]==0&&dis[j]<min1) { now=j; min1=dis[j]; } } if(now==MAX)///防止不成图 { break; } logo[now]=1; sum=sum+min1; for(j=1;j<=n;j++)///填入新点后更新最小距离,到顶点集的距离 { if(logo[j]==0&&dis[j]>map1[now][j]) { dis[j]=map1[now][j]; } } } printf("%d\n",sum); } int main() { int i,j,x; while(scanf("%d",&n)!=EOF)///n是点数 { if(n==0) { break; } memset(map1,0x3f3f3f3f,sizeof(map1));///map是邻接矩阵储存图的信息 for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&x); map1[i][j]=x; } } prim(); } return 0; }
标签:case 最小 cpp bsp mit 联网 排序 strong other
原文地址:https://www.cnblogs.com/wkfvawl/p/9245561.html