HDU 1863 畅通工程 (最小生成树

Posted Draymonder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1863 畅通工程 (最小生成树相关的知识,希望对你有一定的参考价值。

 

看卿学姐视频学到的题目

 

kruskal算法实现最小生成树

#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
typedef long long ll;
int n,m;
struct edge{
    int from ,to;
    ll cost;
}E[maxn*maxn];
bool cmp(edge a,edge b)
{
    return a.cost < b.cost;
}
int fa[maxn];
void init()
{
    for(int i=1; i <= maxn; i++)
        fa[i] = i;
}
int fi(int x)
{
    return fa[x] == x? x :fa[x] = fi(fa[x]);
}

void Union(int x,int y)
{
    int f1=fi(x);
    int f2=fi(y);
    if(f1 != f2)
        fa[f1] = f2;
}

bool check(int x,int y)
{
    return fi(x) == fi(y);
}

ll kruskal()
{
    ll cnt = 0;
    sort(E+1,E+1+m,cmp);
    for(int i=1;i <= m;i++)
    {
        if(check(E[i].from,E[i].to)) continue;
        Union(E[i].from,E[i].to);
        cnt += E[i].cost;
    }
    return cnt;
}

int main ()
{
    while (~scanf("%d %d",&m,&n) && m){
        init();
        for(int i=1;i <= m;i++)
        {
            scanf("%d %d %lld",&E[i].from,&E[i].to,&E[i].cost);
        }
        ll res = kruskal();
        for(int i=1; i <=n;i++)
            if(!check(i,1))
                res = -1;
        if(res == -1)
            puts("?");
        else
            printf("%lld\n",res);
    }
    return 0;
}

 

 prim 算法实现  (坑点好多  还要多写写 熟练一些

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 105;
int n,m;
struct edge{
    int to;
    ll cost;
    edge(){}
    edge(int tt,ll cc):to(tt),cost(cc){}
    bool operator < (const edge &l)const{
        return l.cost < cost;
    }
};

priority_queue<edge> que;
vector <edge> G[maxn];
bool vis[maxn];

void init()
{
    memset(vis,0,sizeof(vis));
    while (que.size())
        que.pop();
    for(int i=0;i <= n;i++)
        G[i].clear();
}

ll prim()
{
    vis[1] = 1;//要把1先加进去
    ll cnt = 0;
    for(int i=0; i < G[1].size();i++)//从第一个顶点取出最短的边
        que.push( G[1][i] );
    while(que.size())
    {
        edge e = que.top();
        que.pop();
        if(vis[e.to])
            continue;
        vis[e.to] = 1;
        cnt += e.cost;
        for(int i=0;i< G[e.to].size();i++)
            que.push(G[e.to][i]);
        //cout << cnt<<endl;
    }
    return cnt;
}

int main ()
{
    while (~scanf("%d %d",&m,&n) && m){
        init();
        for(int i=1;i <= m;i++)
        {
            int u,v;
            ll cost;
            scanf("%d %d %lld",&u,&v,&cost);
            G[u].push_back(edge(v,cost));
            G[v].push_back(edge(u,cost));
        }

        ll res = prim();
        for(int i=1; i <= n;i++)
            if( vis[i] == 0)
                res = -1;
      //  for(int i=1; i <= n;i++)
           // printf("%d",vis[i]);
        if(res == -1)
            puts("?");
        else
            printf("%lld\n",res);
    }
    return 0;
}

 

以上是关于HDU 1863 畅通工程 (最小生成树的主要内容,如果未能解决你的问题,请参考以下文章

hdu1863 畅通工程 基础最小生成树

HDU - 1863 畅通工程(并查集+最小生成树)

HDU 1863 畅通project (最小生成树)

HDU 1863 畅通工程

1863 畅通工程-并查集最小生成树

C - 畅通工程 (HDU - 1863)