最小生成树(prim算法和kruskal算法)
2024-08-23 07:23:44
学习博客:https://www.cnblogs.com/zhangming-blog/p/5414514.html
其实就是加点法:从不属于这个集合的点中找从本集合可以找到的最小边,加入本集合
看代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e3+;
const int maxk=+;
const int maxx=1e4+;
const ll maxe=+;
#define INF 0x3f3f3f3f3f3f
ll v,e;
bool vis[maxn];//顶点i是否在集合X中
ll cost[maxn][maxn];//存两边的权值
ll mincost[maxn];//从集合X出发的边到每个顶点的最小权值
void solve()
{
ll ans=;
mincost[]=;
while(true)
{
int flag=-;
for(int i=;i<v;i++)
{
if(!vis[i]&&(flag==-||mincost[i]<mincost[flag]))
flag=i;
}
if(flag==-)
break;
vis[flag]=true;
ans+=mincost[flag];
for(int i=;i<v;i++)
{
mincost[i]=min(mincost[i],cost[flag][i]);
}
}
cout<<ans<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin>>v>>e;
for(int i=;i<v;i++)
{
for(int j=;j<v;j++)
{
cost[i][j]=INF;
}
mincost[i]=INF;
cost[i][i]=;
vis[i]=false;
}
for(int i=;i<e;i++)
{
int a,b,va;
cin>>a>>b>>va;
cost[a][b]=va;
cost[b][a]=va;
}
solve();
return ;
}
最新文章
- 通过TStringList保存csv文件,只要循环.Add表格里面的每行记录进去,保存即可
- Java数据结构——哈希表
- 【海岛帝国系列赛】No.6 海岛帝国:战争前线
- 宜家的幸福生活,源于K2 BPM的支撑
- Mac下的SVN客户端工具Cornerstone使用教程
- http协议状态码对照表
- tcpdump使用和TCP/IP包分析
- HDU 4520 小Q系列故事――最佳裁判(STL)
- Qt之QHeaderView加入复选框
- java.lang.Object学习总结
- 一些关于IO流的问题
- Linux下tar压缩解压缩命令详解
- itexpdf同一个段落不同文字,如何设置不同的格式
- 关于next.js中的css
- BZOJ.4530.[BJOI2014]大融合(LCT)
- 利用FFMPEG命令进行文件分割
- Nginx+Tomcat+Memcached 实现集群部署时Session共享
- 微信分享自定义标题和图片的js
- memcached集群安装与测试
- 7.1 - CRM系统