hdu1301 prim和kruskal求最小生成树
来源:互联网 发布:淘宝网苹果6手机价格 编辑:程序博客网 时间:2024/06/06 15:41
水题
#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<string>#include<map>#include<set>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<sstream>#define LL long long#define OJ_DEBUG 0#define READ_FILE 0using namespace std;const int NN_MAX = 510;const int MM_MAX = 100010;const int INF = 0x1fffffff;/**********************************************************/int n,cnt;int maps[NN_MAX][NN_MAX],minCost[NN_MAX];bool vis[NN_MAX];/**********************************************************/int min_2 (int x,int y) {return x<y?x:y;}int max_2 (int x,int y) {return x>y?x:y;}void prim();/**********************************************************/int main(){ if (READ_FILE) freopen ("in.txt","r",stdin); while(scanf("%d",&n) && n) { int m,k; for(int i=0;i<=n;i++) for(int j=i;j<=n;j++) maps[i][j]=maps[j][i]=(i==j?0:INF); for(int i=1;i<n;i++) { char tmp[2]; int x,y; scanf("%s %d",tmp,&m); x=tmp[0]-'A'+1; for(int j=0;j<m;j++){ scanf("%s %d",tmp,&k); y=tmp[0]-'A'+1; maps[x][y]=maps[y][x]=k; } } cnt=0; prim(); printf("%d\n",cnt); } return 0;}void prim(){ memset(vis,0,sizeof(vis)); for(int i=0;i<=n;i++) minCost[i]=INF;//minCost是从已选的点集出发,到未选点距离最小权值 minCost[1]=0; for(int i=1;i<=n;i++){//循环n次 int x=0; for(int j=1;j<=n;j++) if(!vis[j] && minCost[j]<minCost[x]) x=j;//找到未选点,且权值最小 vis[x]=1; cnt+=minCost[x]; for(int j=1;j<=n;j++) if(!vis[j]) minCost[j]=min_2(minCost[j],maps[x][j]);//从x出发,更新未选点的最小权值 }}
#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<string>#include<map>#include<set>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<sstream>#define LL long long#define OJ_DEBUG 0#define READ_FILE 1using namespace std;const int NN_MAX = 510;const int MM_MAX = 100010;const int INF = 0x1fffffff;struct Edge{ int a,b,c; Edge (int a1=0,int b1=0,int c1=0):a(a1),b(b1),c(c1){} bool operator < (const Edge& chs)const{return c<chs.c;}}theEdge[NN_MAX*NN_MAX];/**********************************************************/int n,cnt,lenEdge;int p[NN_MAX*NN_MAX];/**********************************************************/int min_2 (int x,int y) {return x<y?x:y;}int max_2 (int x,int y) {return x>y?x:y;}int find(int i) {return i==p[i]?i:p[i]=find(p[i]);}bool merge(int i,int j){ int x=find(i),y=find(j); if(x==y) return false; p[x]=y; return true;}void kruskal();/**********************************************************/int main(){ if (READ_FILE) freopen ("in.txt","r",stdin); while(scanf("%d",&n) && n) { int m,k; lenEdge=0; for(int i=1;i<n;i++) { char tmp[2]; int x,y; scanf("%s %d",tmp,&m); x=tmp[0]-'A'+1; for(int j=0;j<m;j++){ scanf("%s %d",tmp,&k); y=tmp[0]-'A'+1; theEdge[lenEdge++]=Edge(x,y,k); } } cnt=0; kruskal(); printf("%d\n",cnt); } return 0;}void kruskal(){ for(int i=0;i<=n;i++) p[i]=i; sort(theEdge,theEdge+lenEdge); for(int i=0;i<lenEdge;i++) if(merge(theEdge[i].a,theEdge[i].b)) cnt+=theEdge[i].c;}
0 0
- hdu1301 prim和kruskal求最小生成树
- Prim和Kruskal求最小生成树
- HDU1301 最小生成树kruskal裸题
- HDU1301 Jungle Roads 【最小生成树Prim】
- 最小生成树poj1258 prim和kruskal
- Prim和Kruskal最小生成树
- 最小生成树--Prim和Kruskal算法
- 最小生成树(Prim和Kruskal)
- 最小生成树 - Prim 和Kruskal
- 最小生成树 prim算法和kruskal
- 最小生成树Prim和Kruskal算法
- 最小生成树 Prim和Kruskal
- 最小生成树(prim和kruskal)
- 最小生成树算法:prim和kruskal
- 最小生成树模板(Kruskal和prim)
- 最小生成树Prim和kruskal
- 最小生成树 ,prim 和Kruskal 算法
- 最小生成树prim和kruskal算法
- golang 数组切片(一)
- 黑马程序员——常用类(Arrays、Date、基本包装类等)
- 黑马程序员——ios学习笔记 OC 协议&Block
- 黑马程序员——ios学习笔记 OC 分类
- Scala 深入浅出实战经典 第5讲:Scala数组操作实战详解
- hdu1301 prim和kruskal求最小生成树
- 黑马程序员——ios学习笔记 OC Foundation—NSString
- 设计模式:1.2 工厂模式
- HDU 4321 Arcane Numbers 2 按位处理, 想法计数题
- Hibernate缓存非常烦人,想要最新数据连session.clear都不好使
- hdu 3693 Math teacher's homework(数位dp)
- Ray Wenderlich的swift教程02--引用类型和值类型
- 黑马程序员——ios学习笔记 OC Foundation—NSArray&NSDictionary
- !HDU 5371 最长双回文串(多校7)-卡时间-(manacher+排序+set+lower_bound())