最小生成树算法模板

来源:互联网 发布:tomcat启动java项目 编辑:程序博客网 时间:2024/06/05 22:59

此处不解释算法,只写代码模板。

prim:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int MAX=0x3f3f3f3f;int flag[101];//用来标记0和1  表示这个点是否被选择过int map[101][101];//邻接矩阵用来存储图的信息int dis[101];//记录任意一点到这个点的最近距离int n;//点个个数int prim(){    int i,t;    int sum=0;    for(i=1; i<=n; i++)   //初始化    {        dis[i]=MAX;        flag[i]=0;    }    for(i=1; i<=n; i++)    {        dis[i]=map[1][i];   //选定1为起始点,初始化    }    dis[1]=0;    flag[1]=1;    int T=n-1;       //循环找最小边,循环n-1次    while(T--)    {        t=MAX;        int min=MAX;        for(i=1; i<=n; i++)        {            if(flag[i]==0&&dis[i]<min)            {                t=i;                min=dis[i];            }        }        if(t==MAX)            break;//防止不成图        flag[t]=1;        sum+=min;        for(i=1; i<=n; i++)//添入新点后更新最小距离        {            if(flag[i]==0&&dis[i]>map[t][i])                dis[i]=map[t][i];        }    }    if(t==MAX)        cout<<"?"<<endl;    else        cout<<sum<<endl;}int main(){    int a,b,c,d,m,i;    while(cin>>n&&n)//n是点数    {        m=n*(n-1)/2;//m是边数        memset(map,MAX,sizeof(map));//map是邻接矩阵存储图的信息        for(i=1; i<=m; i++)        {            cin>>a>>b>>c;            if(c<map[a][b])//防止重边                map[a][b]=map[b][a]=c;        }        prim();    }}

Kruskal算法

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n, m,sum;struct node{    int start;    int end;    int power;//start为起始点,end为终止点,power为权值} edge[5050];int pre[5050];bool cmp(struct node a,struct node b){    return a.power<b.power;//按照权值排序}int find(int x)//并查集找祖先{    if(x!=pre[x])        pre[x]=find(pre[x]);    return pre[x];}void merge(int x,int y,int i)//并查集合并函数,n是用来记录最短路中应该加入哪个点{    int fx=find(x);    int fy=find(y);    if(fx!=fy)    {        pre[fx]=fy;        sum+=edge[i].power;    }}int main(){    while(cin>>n&&n)//n是点数    {        sum=0;        m=n*(n-1)/2;//m是边数,可以输入        int i;        int start,end,power;        for(i=1; i<=m; i++)        {            cin>>start>>end>>power;            edge[i].start=start,edge[i].end=end,edge[i].power=power;        }        for(i=1; i<=m; i++)        {            pre[i]=i;        }//并查集初始化        sort(edge+1, edge+m+1,cmp);  //对权值进行排序        for(i=1; i <= m; i++)        {            merge(edge[i].start,edge[i].end,i);        }        cout<<sum<<endl;    }    return 0;}
原创粉丝点击