最小生成树之prim算法

prim算法理论基于MST性质,实现过程如下图所示:

 

附上HDU1233 AC CODE:

#include <algorithm>
#include <functional>
#include <list>
#define MAX 101
using namespace std;

int n,a,b,c;
int map[MAX][MAX];
list<int> v,u;

int main()
{
    while(scanf("%d",&n)!=EOF && n!=0)
    {
        memset(map,0,sizeof(map));
        v.clear();
        u.clear();
        for(int i=0;i<(n*(n-1)/2);i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            map[a][b]=map[b][a]=c;
        }
        
        for(int i=1;i<=n;i++)
        {
            v.push_back(i);
        }
        u.push_back(*v.begin());
        v.erase(v.begin());
        int sum=0;
        while(v.size())
        {
            int min=1<<30;
            list<int>::iterator viter,uiter,vi,ui;
            for(vi=v.begin();vi!=v.end();vi++)
            {
                for(ui=u.begin();ui!=u.end();ui++)
                {
                    if(map[*vi][*ui]<min)
                    {
                        min=map[*vi][*ui];
                        viter=vi;
                        uiter=ui;
                    }
                }
            }
            sum+=min;
            u.push_back(*viter);
            v.erase(viter);
        }
        printf("%d\n",sum);
    }
    return 0;
}

 

HDU1879

#include <algorithm>
#include <functional>
#include <list>
#define MAX 101
using namespace std;

int n;
int val[MAX][MAX];
bool has[MAX][MAX];
list<int> v,s;

int main()
{
    while(scanf("%d",&n)!=EOF && n!=0) 
    {
        memset(val,0,sizeof(val));
        memset(has,false,sizeof(has));
        v.clear();
        s.clear();
        
        for(int i=0;i<(n*(n-1)/2);i++)
        {
            int a,b,c,d;
            scanf("%d%d%d%d",&a,&b,&c,&d);
            val[a][b]=val[b][a]=c;
            has[a][b]=has[b][a]=(d==1?true:false);
        }
        
        for(int i=1;i<=n;i++)
        {
            v.push_back(i);
        }
        
        s.push_back(v.front());
        v.pop_front();
        int sum=0;
        while(v.size())
        {
            list<int>::iterator viter,vi,si;
            int m=1<<30;
            for(vi=v.begin();vi!=v.end();vi++)
            {
                for(si=s.begin();si!=s.end();si++)
                {
                    if(val[*vi][*si] && val[*vi][*si]<=m || has[*vi][*si])
                    {
                        if(has[*vi][*si])
                        {
                            m=0;
                        }
                        else
                        {
                            m=val[*vi][*si];
                        }
                        //printf("%d->%d:%d\n",*vi,*si,m);
                        viter=vi;
                    }
                }
            }
            sum+=m;
            s.push_back(*viter);
            v.erase(viter);
        }
        printf("%d\n",sum);
    } 
    return 0;
}

 

posted @ 2012-07-05 10:13  Eslizn  阅读(156)  评论(0编辑  收藏  举报