[POJ1258]最小生成树+PRIM+KURSKAL

来源:互联网 发布:周潜川内经知要讲义 编辑:程序博客网 时间:2024/05/20 06:51

【题目】:http://poj.org/problem?id=1258


【代码】:

第一个是PRIM算法

#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define size 200#define MAX 99999999int array[size][size];int low[size];bool flag[size];int sum,num,i,k;int Prim(int n){sum=0;    memset(flag,false,sizeof(flag));    flag[0] = true;    for(i = 1; i < n; i++) low[i] = array[0][i];    for(i=1;i<n;i++){        int min = MAX;        int j = 0;        for(k = 1; k < n; k++)            if( low[k] < min && flag[k]==false )            {                min = low[k];                j = k;            }        sum += min;        flag[j] = true;        for(k = 1; k < n; k++)            if(array[j][k] < low[k] && flag[k]==false)                low[k] = array[j][k];    }    return sum;}int main(){while(cin>>num){for(i = 0; i < num; i++)for(int j = 0; j < num; j++)scanf("%d",&array[i][j]);printf("%d\n",Prim(num));}    return 0;}


第二个是Kruskal

#include<cstdio>#include<cstring>#include<iostream>#include<stdlib.h>#define MAX 5000typedef struct _edge{    int x,y;    int weight;};struct _edge edge[MAX];int father[MAX];int rank[MAX];int sum;void initial(){    memset(rank,0,sizeof(rank));    int i;    for(i=0;i<MAX;i++)        father[i]=i;    sum=0;}int Find_Set(int x){    if(x!=father[x])        father[x]=Find_Set(father[x]);    return father[x];}int Union_Set(int x,int y,int w){    int a,b;    a=Find_Set(x);    b=Find_Set(y);    if(a==b) return 0;    if(rank[x]>rank[y])        father[b]=a;    else    {        father[a]=b;        if(rank[x]==rank[y]) rank[x]++;    }    sum+=w;    return 1;}int cmp(const void *a,const void *b){    return (*(struct _edge*)a).weight>(*(struct _edge*)b).weight?1:-1;}int main(){    int n;    int i,j;    int cnt;    int tmp;    int x,y;    while(scanf("%d",&n)!=EOF)    {        cnt=0;        for(i=1;i<=n;i++)            for(j=1;j<=n;j++)                {                    if(i<j)                    {                        edge[cnt].x=i;                        edge[cnt].y=j;                        scanf("%d",&edge[cnt].weight);                        cnt++;                    }                    else scanf("%d",&tmp);                }        qsort(edge,cnt,sizeof(edge[0]),cmp);        initial();        for(i=0;i<cnt;i++)        {            x=Find_Set(edge[i].x);            y=Find_Set(edge[i].y);            if(x!=y) Union_Set(x,y,edge[i].weight);        }        printf("%d\n",sum);    }    return 0;}



0 0
原创粉丝点击