浙大数据结构:08-图7 公路村村通

最小生成树入门题,这里我采用prim算法来解决

1、条件准备

ifintree数组标记是否访问过
n,m为结点数量和输入边数量
graph数组存图
N是定义的一个最大值常量

cpp 复制代码
 #include <iostream>
  #include<vector>
  #include<string.h>
  using namespace std;
  #define endl '\n'

  int ifintree[1005];
  int n,m;
  int graph[1005][1005];
  const int N=0x01010101;

2、主函数

输入数据存图
这里初始化graph数组的每个字节为1,那么每一个元素值就为N
然后调用prim函数

cpp 复制代码
  int main()
  {
    std::ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>n>>m;
    memset(graph,1,sizeof(graph));
  while(m--)
  {
    int a,b,v;
    cin>>a>>b>>v;
    graph[a][b]=v;
    graph[b][a]=v;
  }
  prim();
    return 0;
  }

3、prim函数

首先定义mindist数组,每个元素值为N,含义为到该生成树上结点的最小值。
然后遍历n-1遍,生成n-1条边,minval为到该生成树的最短距离,cur为该节点标号,第一次进入for循环一定会使得cur为1,最后输出也不用考虑mindist[1]即可算n-1条边
将该节点加入生成树中然后遍历每个结点,更新该结点到生成树上结点的最短距离
最后循环判断mindist数组,如果有值仍为N则没走到该结点,输出-1,否则加到answer上最后输出

cpp 复制代码
void prim()
{
  vector<int> mindist(1005,N);

  for(int i=1;i<n;i++)
  {
    int minval=N+1;
    int cur=-1;
    for(int j=1;j<=n;j++)
    if(!ifintree[j]&&mindist[j]<minval)
    {
      minval=mindist[j];
      cur=j;
    }
    ifintree[cur]=1;

    for(int j=1;j<=n;j++)
    {
      if(!ifintree[j]&&graph[cur][j]<mindist[j])
      mindist[j]=graph[cur][j];
    }
  }
  int answer=0; 
  for(int i=2;i<=n;i++)
  { 
    if(mindist[i]==N)
    {
      cout<<"-1";return;
    }
    answer+=mindist[i];
  }
   cout<<answer;
}

4、总结

这道题是最小生成树的模板题,较为简单
完整代码如下

cpp 复制代码
  #include <iostream>
  #include<vector>
  #include<string.h>
  using namespace std;
  #define endl '\n'

  int ifintree[1005];
  int n,m;
  int graph[1005][1005];
  const int N=0x01010101;

void prim()
{
  vector<int> mindist(1005,N);

  for(int i=1;i<n;i++)
  {
    int minval=N+1;
    int cur=-1;
    for(int j=1;j<=n;j++)
    if(!ifintree[j]&&mindist[j]<minval)
    {
      minval=mindist[j];
      cur=j;
    }
    ifintree[cur]=1;

    for(int j=1;j<=n;j++)
    {
      if(!ifintree[j]&&graph[cur][j]<mindist[j])
      mindist[j]=graph[cur][j];
    }
  }
  int answer=0; 
  for(int i=2;i<=n;i++)
  { 
    if(mindist[i]==N)
    {
      cout<<"-1";return;
    }
    answer+=mindist[i];
  }
   cout<<answer;
}
  int main()
  {
    std::ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>n>>m;
    memset(graph,1,sizeof(graph));
  while(m--)
  {
    int a,b,v;
    cin>>a>>b>>v;
    graph[a][b]=v;
    graph[b][a]=v;
  }
  prim();
    return 0;
  }
相关推荐
谷雨不太卷7 小时前
进程的状态码
java·前端·算法
顾温7 小时前
default——C#/C++
java·c++·c#
凉茶钱7 小时前
【c语言】动态内存管理:malloc,calloc,realloc,柔性数组
c语言·c++·vscode·柔性数组
脏脏a7 小时前
【C++模版】泛型编程:代码复用的终极利器
开发语言·c++·c++模版
island13147 小时前
【C++仿Muduo库#3】Server 服务器模块实现上
服务器·开发语言·c++
散峰而望7 小时前
【算法竞赛】C/C++ 的输入输出你真的玩会了吗?
c语言·开发语言·数据结构·c++·算法·github
小龙报7 小时前
【C语言】内存里的 “数字变形记”:整数三码、大小端与浮点数存储真相
c语言·开发语言·c++·创业创新·学习方法·visual studio
躺不平的理查德7 小时前
时间复杂度与空间复杂度备忘录
数据结构·算法
yaki_ya7 小时前
yaki-C语言:从概念基础到内存解析---数组(array)完全指南
java·c语言·算法
刃神太酷啦7 小时前
扒透 STL 底层!map/set 如何封装红黑树?迭代器逻辑 + 键值限制全手撕----《Hello C++ Wrold!》(23)--(C/C++)
java·c语言·javascript·数据结构·c++·算法·leetcode