POJ 1258 Agri-Net

本文介绍了一个使用Prim算法解决最小生成树问题的具体实例。通过详细解释代码实现过程,展示了如何逐步构建最小生成树,并确保每一轮迭代后都能得到当前最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一个典型的Prim算法应用,在具体的这个1258中碰到一些小accident,
由于是多case的,所以每次都需要把flag,U_Set清空掉,便于下一次执行
  1. #include<iostream>
  2. #include<cstdio>
  3. #include <vector>
  4. using namespace std;
  5. const int MAX = 101;
  6. const int INF = 100001;
  7. int c[MAX][MAX];
  8. bool flag[MAX];
  9. vector<int> U_Set;
  10. int Prim(int n)
  11. {
  12.         int ans = 0;
  13.         U_Set.push_back(1);
  14.         flag[1] = true;
  15.         for(int i = 1; i < n; i++)
  16.         {
  17.             int start = 1;
  18.             int k = 1;
  19.             int end = 1;
  20.             int min = INF;
  21.             int U_len = U_Set.size();
  22.             for(int p=0;p<U_len;p++) {
  23.                 start = U_Set[p];//每次取出U集合中一个点,与不是U集合中的点比较,取路程最小的一个
  24.                 for(k=1;k<=n;k++)
  25.                 {
  26.                     if(start!=k&&c[start][k]<min &&!flag[k])
  27.                     {
  28.                         min = c[start][k];
  29.                         end = k;
  30.                     }
  31.                 }
  32.             }
  33.             //找到那个点以后,flag置为true
  34.             flag[end] = true;
  35.             U_Set.push_back(end);
  36.             //边为start----end
  37.             //把这两个点之间的长度 add ans
  38.             ans += min;
  39.         }
  40.         return ans;
  41. }
  42. int main() {
  43.     int i, j, n, m;
  44.     while(scanf("%d",&n)!=EOF) {
  45.         for(i = 1; i <= n; i++)
  46.         {
  47.             for(j = 1; j <=n; j++)
  48.             {
  49.                 cin>>c[i][j];
  50.             }
  51.         }
  52.     memset(flag,0,sizeof(flag));
  53.     U_Set.clear();
  54.     cout<<Prim(n)<<endl;
  55.     }
  56.     return 0;
  57. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值