hihoCoder1097:最小生成树一:Prime算法
题目链接: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了...改都不用改==