最小生成树+并查集模板
来源:互联网 发布:软件配置管理人员职责 编辑:程序博客网 时间:2024/04/28 10:56
hdu 1233 hdu 1102 poj 1789 hdu 1301 hdu 2682
模板:
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>#define inf 0x3f3f3f3fusing namespace std;int a[601][601];int dis[601],vis[601],n,m,k;int f[601];int find(int t)//并查集判断是否连通{ if(f[t]==-1) return t; return f[t]=find(f[t]);}void bing(int a,int b){ int t1=find(a); int t2=find(b); if(t1!=t2) f[t1]=t2;}int prim()//普里姆算法{ int sum=0,i,j,k=0,minn; memset(vis,0,sizeof(vis)); for(i=0; i<n; i++) { dis[i]=a[0][i]; vis[i]=0; } vis[0]=1; for(i=0; i<n-1; i++) { minn=inf; for(j=0; j<n; j++) { if(vis[j]==0&&dis[j]<minn) { minn=dis[j]; k=j; } } sum+=minn; vis[k]=1; for(j=0; j<n; j++) { if(vis[j]==0&&dis[j]>a[k][j]) dis[j]=a[k][j]; } } return sum;}int main(){ while(scanf("%d%d",&m,&n),m!=0) { int i,x,y,d; memset(a,inf,sizeof(a)); for(i=0; i<n; i++) a[i][i]=0; for(i=1;i<=n;i++) f[i]=-1; for(i=0; i<m; i++) { scanf("%d%d%d",&x,&y,&d); bing(x,y); a[x-1][y-1]=a[y-1][x-1]=d; } int res=0; for(i=1;i<=n;i++) { if(f[i]==-1) res++; } //printf("%d\n",res);//只能 if(prim()==0||prim()==inf||res>1) printf("?\n"); else printf("%d\n",prim()); }}
2 0
- 最小生成树+并查集模板
- 最小生成树模板 并查集
- 并查集&&最小生成树(模板)
- 最小生成树---kruskal模板(并查集优化)
- 【并查集 最小生成树两种模板(MST)】
- 最小生成树kruskal 并查集合 模板题
- 并查集与最小生成树
- 并查集模版&最小生成树
- 最小生成树kruscal+并查集
- 并查集+最小生成树_HDU_1102
- bzoj1050(最小生成树 并查集)
- 最小生成树与并查集
- 最小生成树与并查集
- 最小生成树+并查集+ kruskal
- 并查集 最小生成树
- 最小生成树(并查集)
- 最小生成树&并查集练习
- 并查集/最小生成树
- Android Studio 快捷键设置
- JAVA静默加载Class
- 排序算法之直接插入排序
- NAU8810相关问题
- Node之文件路径处理模块:path模块
- 最小生成树+并查集模板
- python3.6学习笔记
- 请自觉为多态的基类声明virtual析构函数
- 页面选择列表实现逐一添加到容器中
- 同步异步和阻塞非阻塞的区别
- Hibernate做同一个事物中做两次删除问题
- 一句话说明canvas 中的save()和restore()的用途
- js判断手指滑动方向(移动端)
- localtime与localtime_r