//prim算法
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
#define MAX 510
const int INF=1000000000;
using namespace std;
//顶点到集合s的最短距离
int d[MAX],G[MAX][MAX];
int n,m;
bool isVisit[MAX]={false};
//返回最小生成树的边权之和
int prim(){
fill(d,d+MAX,INF);
d[0]=0;
int ans=0;
for(int i=0;i<n;i++){
int u=-1,MIN=INF;
for(int j=0;j<n;j++){
if(isVisit[j]==false&&d[j]<MIN){
u=j;
MIN=d[j];
}
}
if(u==-1) return -1;
isVisit[u]=true;
ans+=d[u];
for(int v=0;v<n;v++){
if(isVisit[v]==false&&G[u][v]!=INF&&G[u][v]<d[v])
d[v]=G[u][v];
}
}
return ans;
} int main(){
int u,v,w;
//顶点个数,边数
scanf("%d%d",&n,&m);
//初始化图
fill(G[0],G[0]+MAX*MAX,INF);
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&w);
G[u][v]=G[v][u]=w;
}
int ans=prim();
printf("%d\n",ans);
return 0;
}

  类似Dijkstra算法,但是此时d[]表示顶点Vi与集合S的最短距离

kruskal算法:

运用并查集,判断两个点是否在一个及集合中,,即测试两个端点是否在不同连通块中

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
const int MAX=;
const int MAXE=;
const int INF=;
using namespace std;
//顶点到集合s的最短距离
int d[MAX],father[MAX];
int n,m;
bool isVisit[MAX]={false};
struct edge{
int node1,node2;
int weight;
}E[MAXE];
bool cmp(edge e1,edge e2){
return e1.weight<e2.weight;
}
int findFather(int x){
int a=x;
while(x!=father[x]){
x=father[x];
}
while(a!=father[a]){
int temp=a;
a=father[a];
father[temp]=x;
}
return x;
}
int kruskal(){
int ans=,num_edge=;
for(int i=;i<n;i++)
father[i]=i;
sort(E,E+m,cmp);
for(int i=;i<m;i++){
int f1=findFather(E[i].node1);
int f2=findFather(E[i].node2);
if(f1!=f2){
father[f1]=f2;
ans+=E[i].weight;
num_edge++;
//边数等于顶点数-1结束
if(num_edge==n-) break;
}
}
if(num_edge!=n-) return -;
else return ans;
} int main(){
//顶点个数,边数
scanf("%d%d",&n,&m);
for(int i=;i<m;i++){
scanf("%d%d%d",&E[i].node1,&E[i].node2,&E[i].weight);
}
int ans=kruskal();
printf("%d\n",ans);
return ;
}

最新文章

  1. ThreadLocal简单理解
  2. UIRefreshControl
  3. 重温Servlet学习笔记--servletContext对象
  4. Struts1.x有两个execute方法,不要重写错哦HttpServletRequest才是对的(转)
  5. spring mvc 注解访问控制器以及接收form数据的方式,包括直接接收日期类型及对象的方法
  6. iOS开发官方文档汇总
  7. 通过js看类似C#中的回掉
  8. PHP+七牛云存储上传图片代码片段
  9. 按键的使用方法(三)-------verilog
  10. 使用Thrift RPC编写程序(服务端和客户端)
  11. Android - 应用名称设置的问题
  12. 回击MLAA:NVIDIA FXAA抗锯齿性能实測、画质对照
  13. [D3] 2. Basics of SVG
  14. Inlay技术要求
  15. 将decimal类型的数据转成2.12这样价钱的显示方式
  16. 网站压力测试ab 命令
  17. SQLServer 导入大脚本文件
  18. linux环境运行java项目并有外部引用jar
  19. 华为MSTP负载均衡配置示例
  20. 网络1711-12&amp;信管1711-12 图 作业评分

热门文章

  1. 推荐两款远程管理Linux工具(基于Windows系统)
  2. windbg bp condition
  3. Django 自定义模型管理器(Manager)及方法
  4. 数据概览神器pandas_profiling
  5. Javascript连续赋值
  6. zabbix--ODBC 监控mysql
  7. 好947 Mybatis 配置resultMap 带參数查询Map 注意selectOne数据库返回结果一条数据库 否则会报错
  8. windows 之间远程大文件传输问题解决
  9. dubbo-源码阅读之容器启动
  10. 类定义包含vecot&lt;类&gt;对象