hihoCoder1097 1098 1109:最小生成树
2015-04-28 16:05
141 查看
hihoCoder1097:最小生成树一:Prime算法
题目链接:http://hihocoder.com/problemset/problem/1097
分析:Prime算法用的是土的邻接矩阵,这在图中顶点数比较小的时候是挺有效的。
实现代码如下:
hihoCoder1098:最小生成树二:Kruscal算法
题目链接:http://hihocoder.com/problemset/problem/1098
分析:本题顶点数和边数较大,邻接矩阵不再适合,可以考虑用前向星来存储图:即最小生成树的Kruskal算法。
实现代码如下:
hihoCoder1109:最小生成树三:堆优化的Prime算法
题目链接:http://hihocoder.com/problemset/problem/1109
分析:用上一个代码直接A了...改都不用改==
题目链接:http://hihocoder.com/problemset/problem/1097
分析:Prime算法用的是土的邻接矩阵,这在图中顶点数比较小的时候是挺有效的。
实现代码如下:
#include <cstdio> #include <cstring> #include <iostream> #define MAX 1005 #define INF 999999999 using namespace std; bool s[MAX]; int map[MAX][MAX],dist[MAX]; int Prime(int n) { int i,j,k,mind,sum; for(i=1;i<=n;i++) dist[i]=map[1][i]; s[1]=true; sum=0; for(i=1;i<=n;i++) { mind=INF; k=1; for(j=1;j<=n;j++) if(!s[j]&&dist[j]<mind) { mind=dist[j]; k=j; } s[k]=true; sum+=dist[k]; for(j=1;j<=n;j++) if(!s[j]&&dist[j]>map[k][j]) dist[j]=map[k][j]; } return sum; } int main() { int n,m; while(scanf("%d",&n)!=-1) { memset(s,false,sizeof(s)); int a,b,x; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&map[i][j]); printf("%d\n",Prime(n)); } return 0; }
hihoCoder1098:最小生成树二:Kruscal算法
题目链接:http://hihocoder.com/problemset/problem/1098
分析:本题顶点数和边数较大,邻接矩阵不再适合,可以考虑用前向星来存储图:即最小生成树的Kruskal算法。
实现代码如下:
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; #define MAX 1000005 typedef struct node { int from,to; int w; }Node;//前向星表示图 Node map[MAX]; int n,m;//n代表边数,m代表顶点数 //并查集部分 int par[MAX],ran[MAX]; void Init() { for(int i=1;i<=n;i++) { par[i]=i; ran[i]=1; } } int Find(int x) { if(par[x]!=x) return par[x]=Find(par[x]); return par[x]; } void Union(int x,int y) { x=Find(x); y=Find(y); if(x==y) return ; if(ran[x]>ran[y]) { par[y]=x; ran[x]+=ran[y]; } else { par[x]=y; ran[y]+=ran[x]; } } //Kruskal算法求最小生成树 int cmp(const Node &a,const Node &b) { return a.w<b.w; } int Kruskal() { Init(); int sum=0,k=0; sort(map+1,map+1+m,cmp); for(int i=1;i<=m;i++) { if(k==n-1) break; int x=Find(map[i].from); int y=Find(map[i].to); if(x!=y) { Union(x,y); sum+=map[i].w; k++; } } return sum; } int main() { while(scanf("%d%d",&n,&m)!=-1) { int a,b,x; for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&x); map[i].from=a; map[i].to=b; map[i].w=x; } printf("%d\n",Kruskal()); } return 0; }
hihoCoder1109:最小生成树三:堆优化的Prime算法
题目链接:http://hihocoder.com/problemset/problem/1109
分析:用上一个代码直接A了...改都不用改==
相关文章推荐
- hihocoder1097、1109最小生成树(prim算法+堆优化)
- [HihoCoder]#1097 : 最小生成树一·Prim算法
- hihoCoder 1098 最小生成树二·Kruscal算法
- [HihoCoder]#1098 : 最小生成树二·Kruscal算法
- 【最小生成树入门专题1】G - 这是水题7 hdu1863 + B - 这是水题2 hihoCoder 1098【kruskal】
- hihoCoder 1097 : 最小生成树一·Prim算法
- hihoCoder 1098 : 最小生成树二·Kruscal算法
- Hihocoder 之 #1097 : 最小生成树一·Prim算法 (用vector二维 模拟邻接表,进行prim()生成树算法, *【模板】)
- hihocoder 1109 : 最小生成树三·堆优化的Prim算法
- hihoCoder 1109 最小生成树三·堆优化的Prim算法
- hihocoder(1098) 最小生成树Kruskal
- hihoCoder 1097 : 最小生成树一·Prim算法
- #1098 : 最小生成树二·Kruscal算法
- 九度OJ 1109:连通图 (最小生成树)
- #1098 : 最小生成树二·Kruscal算法
- HIHO #1109 : 最小生成树三·堆优化的Prim算法
- Hihocoder #1098 : 最小生成树二·Kruskal算法 ( *【模板】 )
- HIHO #1098 : 最小生成树二·Kruscal算法
- #1098 : 最小生成树二·Kruscal算法
- hiho 1097 : 最小生成树一·Prim算法