51nod 1212 无向图最小生成树 【Prim || Kruskal】

版权声明:转载的时候记着点个赞再评论一下! https://blog.csdn.net/LOOKQAQ/article/details/82555887

1212 无向图最小生成树 

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

 收藏

 关注

N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。

Input

第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)
第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)

Output

输出最小生成树的所有边的权值之和。

Input示例

9 14
1 2 4
2 3 8
3 4 7
4 5 9
5 6 10
6 7 2
7 8 1
8 9 7
2 8 11
3 9 2
7 9 6
3 6 4
4 6 14
1 8 8

Output示例

37

prim算法:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+10;
const int inf = 0x3f3f3f3f;
int map1[maxn][maxn];
int vis[maxn],cost[maxn];
int n,m,u,v,w;
void prim()
{
    memset(vis,0,sizeof(vis));
    int mincost = 0,next;
    for(int i=1;i<=n;i++)
        cost[i]=map1[1][i];
    vis[1]=1;
    int min;
    for(int i=1;i<n;i++) 
    {
        min = inf;
        for(int j=1;j<=n;j++)  //找出距离源点最近的点
        {
            if(!vis[j] && min>cost[j])
            {
                min = cost[j];
                next = j;
            }
        }
        if(min==inf)  //判断未联通的情况
        {
            cout<<"不存在"<<endl;
            return;  //结束程序
        }
        mincost+=min;
        vis[next]=1;
        for(int j=1;j<=n;j++)  //这一层for循环是为了更新最小值(包括刚并入的点)
        {
            if(!vis[j] && cost[j]>map1[next][j])
                cost[j]=map1[next][j];
        }
    }
    cout<<mincost<<endl;;
}
int main()
{
    cin>>n>>m;
    memset(map1,inf,sizeof(map1)); //注意初始化为无穷大
    for(int i=1;i<=m;i++)
    {
        cin>>u>>v>>w;
        map1[u][v]=map1[v][u]=w;
    }
    prim();
    return 0;
}

kruskal算法:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e4+10;
int pre[maxn];
int find(int x)
{
    return x==pre[x]?x:find(pre[x]);
}
void join(int x,int y)
{
    int fx = find(x);
    int fy = find(y);
    if(fx!=fy)
        pre[fx]=fy;
}
struct inp{
   int s,e,w;
}p[maxn];
bool cmp(inp a,inp b)
{
    return a.w<b.w;
}
int main()
{
    ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        pre[i]=i;
    for(int i=0;i<m;i++)
        cin>>p[i].s>>p[i].e>>p[i].w;
    sort(p,p+m,cmp);
    int ans=0;
    for(int i=0;i<m;i++)
    {
        if(find(p[i].s)!=find(p[i].e))
        {
            ans+=p[i].w;
            join(p[i].s,p[i].e);
        }
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/LOOKQAQ/article/details/82555887