Sicily1083(最小生成树)

来源:互联网 发布:淘宝管控记录可归零吗 编辑:程序博客网 时间:2024/06/06 17:26
#include <iostream>#include <cstdio>#include <cstdlib>#include <list>#include <stack>#include <algorithm>using namespace std;int main(){  const int max=100000000;  int T;  while (1)  {    int n,m;    scanf("%d",&n);    if (!n)        break;    scanf("%d",&m);    int i,j,A[100][100];    int d[100];    bool record[100]={false};    int a,b,dis;    for (i=0;i<=n-1;i++)        for (j=0;j<=n-1;j++)            A[i][j]=max;    for (i=0;i<=m-1;i++)    {        scanf("%d%d",&a,&b);        scanf("%d",&dis);        if (dis<A[a-1][b-1])            A[a-1][b-1]=A[b-1][a-1]=dis;    }    for (i=0;i<=n-1;i++)        d[i]=max;    int min;    int pos;    int ans=0;    d[0]=0;    for (i=0;i<=n-1;i++)    {        int k;        min=max;        for (j=0;j<=n-1;j++)            if (!record[j] && d[j]<min)            {                pos=j;                min=d[pos];            }        if (min==max)            continue;        ans+=min;        record[pos]=1;        for (j=0;j<=n-1;j++)            if (!record[j] && A[pos][j]<d[j])                d[j]=A[pos][j];    }    printf("%d\n",ans);  }  return 0;}                


Kruskal算法:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int parent[105];int getpar(int a){if (parent[a]!=a)parent[a]=getpar(parent[a]);return parent[a];}struct Edge{int a,b;int v;}n[10005];bool cmp(struct Edge a,struct Edge b){return a.v<b.v;}int main(){int P,R;while (1){scanf("%d",&P);if (!P) break;scanf("%d",&R);int ans=0;int num=0;int i;for (i=0;i<=R-1;i++){scanf("%d%d%d",&n[i].a,&n[i].b,&n[i].v);parent[n[i].a]=n[i].a;parent[n[i].b]=n[i].b;}sort(n,n+R,cmp);for (i=0;i<=R-1;i++){int roota=getpar(n[i].a);int rootb=getpar(n[i].b);if (roota!=rootb){parent[roota]=rootb;ans+=n[i].v;num++;}if (num==P-1)break;}printf("%d\n",ans);}return 0;}


原创粉丝点击