poj 1287 Networking

最小生成树

分别用prime和kruskal算法实现。

prime算法判断是否连通是查看是否加入了n-1条边(即循环是否执行了n-1次)

kruskal算法判断是否连通是     最后查看是否所有点都在同一集合内

prime算法:

#include <iostream>
#include <memory.h>
using namespace std;
const int IN = (1<<28);
int G[55][55];
int locost[55];
int N,M,Cost,flag;
void prime()
{
    locost[1] = 0;
    for( int i = 1; i <= N; i++ )
    {
        locost[i] = G[1][i];
    }
    for( int u = 1; u < N; u++ )
    {
        int MinV = 0, Min = IN;
        for( int i = 1; i <= N; i++ )
        {
            if( locost[i] && locost[i] < Min )
            {
                MinV = i;
                Min = locost[i];
            }
        }
        if( !MinV )
        {
            flag = 0;
            break;
        }
        else
        {
            Cost += locost[MinV];
            locost[MinV] = 0;
            for( int i = 1; i <= N; i++ )
            {
                if( locost[i] && locost[i] > G[MinV][i] )
                {
                    locost[i] = G[MinV][i];
                }
            }
        }
    }
}
int main()
{
    while( cin >> N, N )
    {
        cin >> M;
        memset(G, 0, sizeof(G));
        memset(locost, 0, sizeof(locost));
        for( int i = 1; i <= N; i++ )
            for( int j = 1; j <= N; j++ )
        {
            if( i==j )
                G[i][j] = 0;
            else
                G[i][j] = IN;
        }
        while( M-- )
        {
            int Begin,End,Len;
            cin >> Begin >> End >> Len;
            if( Len < G[Begin][End] )
            {
                G[Begin][End] = Len;
                G[End][Begin] = Len;
            }
        }
        Cost = 0;
        flag = 1;
        prime();
        if( flag )
            cout << Cost << endl;
        else
            cout << 0 << endl;
    }
    return 0;
}

kruskal算法:

#include <iostream>
#include <queue>
#include <memory.h>
using namespace std;
struct Edage
{
    int sou,des,length;
    Edage( int ss = 0, int dd = 0, int ll = 0 ):sou(ss),des(dd),length(ll) {}
    friend bool operator <( const Edage &a, const Edage &b )
    {
        return a.length > b.length;
    }
};
priority_queue <Edage> Edages;
int id[55];
int N,M,Cost;
void init_union()
{
    for( int i = 1; i <= N; i++ )
    {
        id[i] = i;
    }
}
int Find( int p )
{
    return id[p];
}
int Isconnect( int p, int q )
{
    int pid = id[p];
    int qid = id[q];
    if( pid == qid )
        return 1;
    else
        return 0;
}
void unit( int p, int q )
{
    int pid = id[p];
    int qid = id[q];
    if( pid == qid )
        return;
    else
    {
        for( int i = 1; i <= N; i++ )
        {
            if( id[i] == qid )
            {
                id[i] = pid;
            }
        }
    }
}
void kruskal()
{
    init_union();
    int cnt = 0;
    while( !Edages.empty() && cnt != N-1 )
    {
        Edage now = Edages.top();
        Edages.pop();
        int p = now.sou;
        int q = now.des;
        if( !Isconnect( p, q ) )
        {
            Cost += now.length;
            cnt++;
            unit( p, q );
        }
    }
}
bool Judge()
{
    int ID = id[1];
    for( int i = 1; i <= N; i++ )
        if( id[i] != ID )
            return false;
    return true;
}
int main()
{
    while( cin >> N, N != 0 )
    {
        cin >> M;
        while( !Edages.empty() )
        {
            Edages.pop();
        }
        memset(id, 0, sizeof(id));
        while( M-- )
        {
            int Begin,End,Len;
            cin >> Begin >> End >> Len;
            Edages.push( Edage( Begin, End, Len) );
        }
        Cost = 0;
        kruskal();
        if( Judge() )
            cout << Cost << endl;
        else
            cout << 0 << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xutian_curry/article/details/80216881