最小產生樹(模板)

來源:互聯網
上載者:User
kruskal演算法:
#include<iostream>using namespace std;struct edge{    int x,y,c;};edge elist[250010];int n,m,i,j,ans,num,psum;bool hash[250010],bk;int zu[501],e[501];int cmp(const void *s,const void *t){    edge i=*(edge *)s,j=*(edge *)t;    return i.c-j.c;}int find(int x){    if (x!=zu[x]) zu[x]=find(zu[x]);    return zu[x];}void kruskal(){    int i,a,b;    for (i=1;i<=n;i++) zu[i]=i;    num=0;    for (i=1;i<=m;i++)    {        a=find(elist[i].x);        b=find(elist[i].y);        if (a!=b)        {            zu[b]=a;            ans+=elist[i].c;            num++;            e[num]=i;            if (num==n-1) return;        }    }}void sec_kruskal(){    int nnum=0,a,b,i1;    for (i1=1;i1<=n;i1++) zu[i1]=i1;    for (i1=1;i1<=m;i1++)      if (hash[i1])      {            a=find(elist[i1].x);            b=find(elist[i1].y);            if (a!=b)            {                psum+=elist[i1].c;                zu[b]=a;                nnum++;                if (nnum==n-1)                {                    bk=true;                    return;                }            }        }}int main(){    scanf("%d%d",&n,&m);    for (i=1;i<=m;i++)      scanf("%d%d%d",&elist[i].x,&elist[i].y,&elist[i].c);    qsort(elist+1,m,sizeof(edge),cmp);    ans=0;    kruskal();    printf("Cost: %d\n",ans);    ans=0x7fffffff;    memset(hash,1,sizeof(hash));    for (i=1;i<=num;i++){        hash[e[i]]=0;        psum=0;        bk=false;        sec_kruskal();        if (bk)        {            if (psum<ans) ans=psum;        }        hash[e[i]]=1;    }    if (ans==0x7fffffff)  printf("Cost: %d\n",-1);    else printf("Cost: %d\n",ans);    return 0;}

prim演算法:
#include<iostream>#include<cmath>#define N 999999double map[101][101];int visited[101];double mark[101];int n;using namespace std;double dit (double x1,double y1,double x2, double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}double prim(){int i,j,k;double sum=0,min;memset(mark,0,sizeof(mark));memset(visited,0,sizeof(visited));k=1;visited[k]=1;for(i=2;i<=n;i++){mark[i]=map[k][i];               //計算k到各頂點的距離}min=N;for(i=1;i<=n-1;i++)                  {for(j=1;j<=n;j++)if(mark[j]<min&&!visited[j]){min=mark[j];k=j;}visited[k]=1;for(j=1;j<=n;j++){if(mark[j]>map[k][j]&&!visited[j])mark[j]=map[k][j];}sum+=min;min=N;}return sum;}int main(){int i,j;double x[101],y[101];while(cin>>n){for(i=1;i<=n;i++)cin>>x[i]>>y[i];memset(map,0,sizeof(map));for(i=1;i<=n-1;i++){for(j=i+1;j<=n;j++){map[i][j]=map[j][i]=dit(x[i],y[i],x[j],y[j]);}}printf("%.2lf\n",prim());}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.