开始了最小生成树,以简单应用为例hoj1323,1232(求连通分支数,直接并查集即可)

prim(n*n) 一般用于稠密图,而Kruskal(m*log(m))用于系稀疏图

#include<iostream>              //prim  n^2
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
int a[102][102];int dis[102];int mark[102];
int main()
{
int n;
while(cin>>n&&n)
{
int m=n*(n-1)/2;
int x,y;
memset(a,0x3f,sizeof(a));
memset(dis,0x3f,sizeof(dis));
memset(mark,0,sizeof(mark));
while(m--)
{
scanf("%d%d",&x,&y);
int temp;
scanf("%d",&temp);
if(a[x][y]>temp)
a[x][y]=temp;
a[y][x]=a[x][y];
}
int ans=0;
int cur=1;
mark[cur]=1;
for(int i=1;i<n;i++) //加入n-1条边
{
int minedge=inf; int vertex; //每次找最小的边和新加入的点
for(int j=1;j<=n;j++)
if(mark[j]==0)
{
if(dis[j]>a[cur][j]) //更新
{
dis[j]=a[cur][j];
}
if(minedge>dis[j]) //得最小边
{
minedge=dis[j];
vertex=j;
}
}
ans+=minedge;
cur=vertex; //新加入的点cur
mark[cur]=1; //已经加入
}
printf("%d\n",ans);
}
return 0;
}
#include<iostream>        //kruskal ,+并查集维护,m*logm
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
const int inf=0x3f3f3f3f;
int fa[102];
int father(int x){return (x==fa[x]?x:father(fa[x]));}
struct edge
{
int x,y,w;
};
bool my(const edge &a,const edge &b) //先按权重排序
{
return a.w<b.w;
}
int main()
{
int n;
while(cin>>n&&n)
{
int m=n*(n-1)/2;
vector<edge>v(m);
for(int i=1;i<=n;i++) //初始化并查集
fa[i]=i;
for(int i=0;i<m;i++)
{
scanf("%d%d",&v[i].x,&v[i].y);
int temp;
scanf("%d",&temp);
v[i].w=temp;
}
int ans=0;
sort(v.begin(),v.end(),my); //排序
for(int i=0,num=0;num<n-1;i++) //取
{
int xx=father(v[i].x);int yy=father(v[i].y);
if(xx!=yy) //不是同一个连通分量,合并之
{
ans+=v[i].w;
fa[xx]=yy;
num++; //发现一个有效边,共n-1条。
}
}
printf("%d\n",ans);
}
return 0;
}
#include<iostream>                 //求无向图连通分支数,直接并查集。
#include<vector>
#include<algorithm>
#include<cstdio>
#include<set>
using namespace std;
int fa[1002];
int father(int x){return (x==fa[x]?x:father(fa[x]));}
struct edge
{
int x,y;
};
int main()
{
int n,m;
while(~scanf("%d",&n)&&n)
{
scanf("%d",&m);
vector<edge>v(m);
for(int i=1;i<=n;i++)
{
fa[i]=i; //初始化
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&v[i].x,&v[i].y);
} for(int i=0;i<m;i++)
{
int xx=father(v[i].x); //x--y有边。
int yy=father(v[i].y);
fa[xx]=yy;
}
int count=0;
set<int>se;
for(int i=1;i<=n;i++) //只需看有几个father(i)(等价类),一个连通分量只对应一个。
{
se.insert(father(i));
}
count=se.size()-1;
printf("%d\n",count);
}
return 0;
}

最新文章

  1. 让PDF.NET支持最新的SQLite数据库
  2. iOS开发之 用第三方类库实现轮播图
  3. http协议 301和302的原理及实现
  4. CoreAnimation动画(CALayer动画)
  5. java解析密钥格式
  6. jQuery动态加载脚本 $.getScript();
  7. jquery trigger伪造a标签的click事件取代window.open方法
  8. REST client 基于浏览器的测试工具
  9. 解决红米等手机(移动端)无法触发touchend事件
  10. MySQL半同步Semi-sync原理介绍【图说】
  11. linux下不重启加硬盘
  12. 01-UIKit
  13. Firebug及YSlow简介与使用图文详解
  14. 基于angularJs的单页面应用seo优化及可抓取方案原理分析
  15. oracle中 merge into 的用法
  16. 关于Idea模块化部署web项目,Web Resource Directories作用
  17. Saiku多用户使用时数据同步刷新(十七)
  18. HDOJ 3308 LCIS (线段树)
  19. python 面向对象编程(高级篇)
  20. Cxf weblogic 报错: when resolving method &quot;javax.xml.bind.JAXBElement

热门文章

  1. Java编译时根据调用该方法的类或对象所属的类决定
  2. SQL (一)定义变量以及变量赋值
  3. Codeforces GYM 100741A . Queries
  4. IOS中经典的缓存对比
  5. ElasticSearch的常用方法
  6. 【整理】解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function
  7. 常见的User-Agent
  8. 11. GLOBAL_VARIABLES 与 SESSION_VARIABLES
  9. 9. InnoDB通用表空间
  10. 利用system-config-kickstart实现半自动化安装