您的位置:首页 > 其它

最小生成树——修路sdutoj2144——

2014-08-25 16:16 211 查看


题目描述

 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
 


输入

 输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n<=100)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
 


输出

 每组输出占一行,仅输出最小花费。


示例输入

3 2
1 2 1
1 3 1
1 0



示例输出

2
0


代码如下:
//prim算法

#include <iostream>

#include"cstdio"

#include"cstring"

#include"cstdlib"

using namespace std;

int Map[120][120];

int dis[120];

int vis[120];

int n,m;

int sum;

const int inf=999999;

void  prim(int n)

{

    memset(vis,0,sizeof(vis));

    for(int i=1;i<=n;i++)

    {

        dis[i]=Map[1][i];

    }

    vis[1]=1;

    sum=0;

    for(int i=1;i<n;i++)

    {

        int Min=inf;

         int pos;

        for(int j=1;j<=n;j++)

        {

            if(!vis[j]&&dis[j]<Min)

            {

                Min=dis[j];

                pos=j;

            }

        }

        if(Min>=inf)break;

        sum+=Min;

        vis[pos]=1;

        for(int j=1;j<=n;j++)

        {

            if(!vis[j]&&Map[pos][j]<dis[j])

            {

                dis[j]=Map[pos][j];

            }

        }

    }

}

int main()

{

    while(~scanf("%d%d",&n,&m))

    {

        for(int i=1;i<=n;i++)

          {

               for(int j=1;j<=n;j++)

                Map[i][j]=inf;

                Map[i][i]=0;

          }

          for(int i=1;i<=m;i++)

          {

             int a,b,c;

             scanf("%d%d%d",&a,&b,&c);

             if(Map[a][b]>c)

             Map[a][b]=Map[b][a]=c;

          }

          prim(n);

          printf("%d\n",sum);

    }

    return 0;
}

//kruskal算法

#include <algorithm>

#include <iostream>

#include <cstring>

#include <cstdlib>

#include <cstdio>

using namespace std;

int bin[110];

int sum;

int num;

int n,m;

struct node

{

    int u,v,w;

}q[100000];

int finds(int a)

{

    if(a!=bin[a])

        a=finds(bin[a]);

    return a;

}

void Sort(node *s)

{

   for(int i=0;i<m-1;i++)

   {

       int k=i;

       for(int j=k+1;j<m;j++)

       {

           if(s[k].w>s[j].w)

           k=j;

       }

      node t=s[i];s[i]=s[k];s[k]=t;

   }

}

int main()

{

    int i;

    while(~scanf("%d %d",&n,&m))

    {

        sum=0;

        num=0;

        for(i=1;i<=n;i++)

            bin[i]=i;

        for(i=0;i<m;i++)

        {

            scanf("%d %d %d",&q[i].u,&q[i].v,&q[i].w);

        }

        Sort(q);

        for(i=0;i<m;i++)

        {

            int x=finds(q[i].u);

            int y=finds(q[i].v);

            if(x!=y)

            {

                sum+=q[i].w;

                bin[x]=y;

                num++;

            }

            if(num==n-1)

            {

                break;

            }

        }

        printf("%d\n",sum);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: