USACO/Agri-Net

USACO/Agri-Net

Posted by dym on March 13, 2014

本文迁移自老博客,原始链接为 https://seven.blog.ustc.edu.cn/usacoagri-net/

裸的最小生成树,prim。

#include<iostream>
#include<algorithm>
#include<fstream>
#include<stdio.h>
using namespace std;
ofstream fout ("agrinet.out");
ifstream fin ("agrinet.in");

const int INF = 1<<30;
int n;
int ans;
int Min;
int g[101][101];
bool vis[101];
int dis[101];
void prim(int v)
{
	memset(vis , 0 ,sizeof(vis));
	for(int i = 1 ; i <= n ;i++)
	{
		dis[i] = g[v][i];
	}
	vis[1] = true;
	for(int i = 1 ;  i <= n;i++)
	{		
		Min = INF;
		int k;
		for(int j = 1 ; j <= n;j++)
		{
			if(!vis[j] && dis[j] < Min)
			{
				Min = dis[j];
				k = j;
			}
		}
		if(Min < INF)
		{
			vis[k] = true;
			ans += Min;
		}
		for(int j = 1 ; j <= n;j++)
		{
			if(!vis[j] && dis[j] > g[k][j])
			{
				dis[j] = g[k][j];
			}
		}
	}
}
int main()
{
	fin>>n;
	for(int i = 1; i <= n ;i++)
	{
		for(int j = 1 ;j <= n;j++)
		{
			fin>>g[i][j];			
		}
	}
	ans = 0;
	prim(1);
	fout<<ans<<endl;
	return 0;
}