代码一:普里母算法
#include<stdio.h>
int map[101][101];
int visit[101];
int prim(int n);
int main()
{
	int n,m,a,b,i,j;
	while(~scanf("%d",&n))
	{
		for(i=1;i<=n;++i)
		{
			visit[i]=0;
			for(j=1;j<=n;++j)
				scanf("%d",&map[i][j]);
		}
		scanf("%d",&m);
		for(i=1;i<=m;++i)
		{
			scanf("%d%d",&a,&b);
			map[a][b]=map[b][a]=0;
		}
		printf("%d\n",prim(n));
	}
}

int prim(int n)
{
	int i,j,k,min,tot=0;
	int dis[101];
	for(i=1;i<=n;++i)
		dis[i]=map[1][i];
	visit[1]=1;
	for(i=2;i<=n;++i)
	{
		min=0x7fffffff;
		k=1;
		for(j=1;j<=n;++j)
		{
			if(!visit[j]&&min>dis[j])
			{
				min=dis[j];
				k=j;
			}
		}
		visit[k]=1;
		tot+=dis[k];
		for(j=1;j<=n;++j)
			if(!visit[j]&&map[k][j]<dis[j])
				dis[j]=map[k][j];
	}
	return tot;
}

//代码二:克鲁斯卡尔算法(转)
#include <iostream> 
#include <algorithm> 
#define MAX 200 
using namespace std; 
  
int father[MAX]; 
int my_rank[MAX]; 
  
void make_set() 
{ 
    for (int i = 0; i < MAX; i++) 
    { 
        father[i] = i; 
        my_rank[i] = 0; 
    } 
} 
  
int find_set(int x) 
{ 
    if (x != father[x]) 
        father[x] = find_set(father[x]); 
  
    return father[x]; 
} 
  
void union_set(int x, int y) 
{ 
    x = find_set(x); 
    y = find_set(y); 
  
    if (x == y) return; 
  
    if (my_rank[x] > my_rank[y]) 
        father[y] = x; 
    else
    { 
        father[x] = y; 
  
        if (my_rank[x] == my_rank[y]) 
            my_rank[y]++; 
    } 
} 
  
struct edge 
{ 
    int start; 
    int end; 
    int weight; 
}; 
  
bool cmp(const edge& a, const edge& b) 
{ 
    return a.weight < b.weight; 
} 
  
edge e[99*50+2]; 
  
int main() 
{ 
    int N, Q, count; 
    int x, y, cost; 
  
    while (cin >> N) 
    { 
        count = 0; 
        make_set(); 
        for (int i = 1; i <= N; i++) 
        { 
            for (int j = 1; j <= N; j++) 
            { 
                cin >> cost; 
                if (j > i) 
                { 
                    e[count].start = i; 
                    e[count].end = j; 
                    e[count++].weight = cost; 
                } 
            } 
        } 
  
        cin >> Q; 
  
        for (int i = 0; i < Q; i++) 
        { 
            cin >> x >> y; 
            x = find_set(x); 
            y = find_set(y); 
  
            if (x != y) 
                union_set(x, y); 
        } 
  
        sort(e, e+count, cmp); 
        N = count; 
        count = 0; 
        int sum = 0; 
        while (count != N) 
        { 
            x = find_set(e[count].start); 
            y = find_set(e[count].end); 
  
            if (x != y) 
            { 
                union_set(x, y); 
                sum += e[count].weight; 
            } 
  
            count++; 
        } 
        cout << sum << endl; 
    } 
  
    return 0; 
}

 

 

http://acm.hdu.edu.cn/showproblem.php?pid=1102

posted on 2012-06-14 09:38  可笑痴狂  阅读(198)  评论(0编辑  收藏  举报