hihoCoder1097 1098 1109:最小生成树

来源:互联网 发布:悉尼动物园 知乎 编辑:程序博客网 时间:2024/05/24 04:58

hihoCoder1097:最小生成树一:Prime算法

题目链接:http://hihocoder.com/problemset/problem/1097


分析:Prime算法用的是土的邻接矩阵,这在图中顶点数比较小的时候是挺有效的。

实现代码如下:

#include <cstdio>#include <cstring>#include <iostream>#define MAX 1005#define INF 999999999using 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 1000005typedef 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了...改都不用改==

0 0
原创粉丝点击