POJ 1258 Agri-net

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define MAXN 105
#define INF 0xffffff
class Graph
{
	private:
		int V[MAXN];
		int v;
		int e;
		int g[MAXN][MAXN];
	public:
		Graph()
		{
			for(int i = 1; i <= MAXN; i++)
			{
				V[i] = 0;
				for(int j = 1; j <= MAXN; j++)
				{
					g[i][j] = INF;
				}
			}
			v = 0;
			e = 0;
		}
		Graph(int n)
		{
			for(int i = 1; i <= n; i++)
			{
				V[i] = 0;
				for(int j = 1; j <= n; j++)
				{
					g[i][j] = INF;
				}
			}
			v = 0;
			e = 0;
		}
		int getV()
		{
			return v;
		}
		int getE()
		{
			return e;
		}
		int getW(int i, int j)
		{
			return g[i][j];
		}
		void insert(int a, int b)
		{
			g[a][b] = 1;
			e++;
			if(!V[a])
			{
				V[a]++;
				v++;
			}
			if(!V[b])
			{
				V[b]++;
				v++;
			}
		}
		void insert(int a, int b, int w)
		{
			g[a][b] = w;
			e++;
			if(!V[a])
			{
				V[a]++;
				v++;
			}
			if(!V[b])
			{
				V[b]++;
				v++;
			}
		}
		void del(int a, int b)
		{
			g[a][b] = INF;
			e--;
			e++;
			V[a]--;
			V[b]--;
			if(!V[a])
			{
				v--;
			}
			if(!V[b])
			{
				v--;
			}
		}
};
class Mst
{
	private:
		int v;
		int e;
		int maxw;
		int sumw;
		int father[MAXN];
		int distance[MAXN];
		bool visit[MAXN];
	public:
		Graph g;
		Mst()
		{
			v = 0;
			e = 0;
			maxw = 0;
			sumw = 0;
			memset(visit, false, sizeof(visit));
			memset(father, -1, sizeof(father));
		}
		int getMaxW()
		{
			return maxw;
		}
		int getSumW()
		{
			return sumw;
		}
		void primBuild()
		{
			visit[1] = true;
			v++;
			for(int i = 1; i <= g.getV(); i++)
			{
				distance[i] = g.getW(0, i);
			}
			int tmpV;
			for(int j = 1; j <= g.getV(); j++)
			{
				int minDis = INF;
				for(int i = 1; i <= g.getV(); i++)
				{
					if(visit[i] == false && distance[i] < minDis)
		            {
		                minDis = distance[i];
		                tmpV = i;
		            }
				}
				visit[tmpV] = true;
				v++;
				e++;
				sumw += minDis;
				if(maxw < minDis)
				{
					maxw = minDis;
				}
            	for(int i = 1; i <= g.getV(); i++)
		        {
		            if(visit[i] == false && distance[i] > g.getW(v, i))
		            {
		                distance[i] = g.getW(v, i);
		            }
		        }
			}
		}
};
int n, w;

int main()
{
	while(scanf("%d", &n) != EOF)
	{
		Mst mst;
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{
				scanf("%d", &w);
				mst.g.insert(i, j, w);
			}
		}
		mst.primBuild();
		printf("%d\n", mst.getMaxW());	
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值