[kuangbin带你飞]专题六 最小生成树

A - Jungle Roads 题目链接

#include 
#include 
#include 
#include 
using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=30;
bool vis[MAXN];
int lowc[MAXN];
int cost[MAXN][MAXN];


int Prim(int n)
{
	int ans=0;
	memset(vis,false,sizeof(vis));
	memset(lowc,0,sizeof(lowc));
	vis[0]=true;
	for(int i=1;ilowc[j])
			{
				minc=lowc[j];
				p=j;
			}
		}
		if(minc==INF)
			return -1;
		ans+=minc;
		vis[p]=true;
		for(int j=0;jcost[p][j])
				lowc[j]=cost[p][j];
		}
	}
	return ans;
}

void init(int n)
{
	for(int i=0;i

B -  Networking 题目链接

#include 
#include 
#include 
#include 
#include 
using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=59;
bool vis[MAXN];
int lowc[MAXN];
int cost[109][109];

int Prim(int n)
{
	int ans=0;
	memset(vis,false,sizeof(vis));
	vis[1]=true;
	for(int i=2;i<=n;i++)
		lowc[i]=cost[1][i];
	for(int i=2;i<=n;i++)
	{
		int minc=INF;
		int p=-1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&minc>lowc[j])
			{
				minc=lowc[j];
				p=j;
			}
		}
		if(minc==INF)
			return -1;
		ans+=minc;
		vis[p]=true;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&lowc[j]>cost[p][j])
				lowc[j]=cost[p][j];
		}

	}
	return ans;
}

void init(int n)
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cost[i][j]=cost[j][i]=INF;
}
int main()
{
	int n,m;
	while(scanf("%d",&n)==1)
	{
		if(n==0)
			break;
		scanf("%d",&m);
		init(n);
		while(m--)
		{
			int a,b,time;
			scanf("%d%d%d",&a,&b,&time);
			if(cost[a][b]>time)
			{
				cost[a][b]=cost[b][a]=time;
			}
		}
		/*for(int i=1;i

C -  Building a Space Station 题目链接

#include 
#include 
#include 
#include 
#include 
using namespace std;

const double INF=0x3f3f3f3f;
const int MAXN=109;
bool vis[MAXN];
double lowc[MAXN];
double cost[MAXN][MAXN];

double Prim(int n)
{
	double ans=0;
	memset(vis,false,sizeof(vis));
	memset(lowc,0,sizeof(lowc));
	vis[0]=true;
	for(int i=1;ilowc[j])
			{
				minc=lowc[j];
				p=j;
			}
		}
		if(minc==INF)
			return -1;
		ans+=minc;
		vis[p]=true;
		for(int j=0;jcost[p][j])
				lowc[j]=cost[p][j];
		}
	}
	return ans;
}

void init(int n)
{
	for(int i=0;i

D -  Constructing Roads 题目链接

#include 
#include 
#include 
#include 
#include 
using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=109;
bool vis[MAXN];
int lowc[MAXN];
int cost[MAXN][MAXN];


int Prim(int n)
{
	int ans=0;
	memset(vis,false,sizeof(vis));
	memset(lowc,0,sizeof(lowc));
	vis[0]=true;
	for(int i=1;ilowc[j])
			{
				minc=lowc[j];
				p=j;
			}
		}
		if(minc==INF)
			return -1;
		ans+=minc;
		vis[p]=true;
		for(int j=0;jcost[p][j])
				lowc[j]=cost[p][j];
		}
	}
	return ans;
}

void init(int n)
{
	for(int i=0;i

E -  QS Network 题目链接

#include 
#include 
#include 
#include 
#include 
using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=1009;
bool vis[MAXN];
int lowc[MAXN];
int pre[MAXN];
int Max[MAXN][MAXN];
bool used[MAXN][MAXN];

int prim(int cost[][MAXN],int n)
{
	int ans=0;
	memset(vis,false,sizeof(vis));
	memset(Max,0,sizeof(Max));
	memset(used,false,sizeof(used));
	vis[0]=true;
	pre[0]=-1;
	for(int i=1;ilowc[j])
			{
				minc=lowc[j];
				p=j;
			}
		}
		if(minc==INF)
			return -1;
		ans+=minc;
		vis[p]=true;
		used[p][pre[p]]=used[pre[p]][p]=true;
		for(int j=0;jcost[p][j])
			{
				lowc[j]=cost[p][j];
				pre[j]=p;
			}
		}
	}
	return ans;
}

int Prim(int cost[][MAXN],int n)
{
	double ans=0;
	memset(vis,false,sizeof(vis));
	memset(lowc,0,sizeof(lowc));
	vis[0]=true;
	for(int i=1;ilowc[j])
			{
				minc=lowc[j];
				p=j;
			}
		}
		if(minc==INF)
			return -1;
		ans+=minc;
		vis[p]=true;
		for(int j=0;jcost[p][j])
				lowc[j]=cost[p][j];
		}
	}
	return ans;
}

void init(int cost[][MAXN],int n)
{
	for(int i=0;i
I -  Agri-Net 题目链接

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;


const int INF=0x3f3f3f3f;
const int MAXN=109;
bool vis[MAXN];
int lowc[MAXN];
int cost[MAXN][MAXN];
int n;

int Prim()
{
	int ans=0;
	memset(vis,0,sizeof(vis));
	vis[1]=true;
	for(int i=2;i<=n;i++)
	{
		lowc[i]=cost[1][i];
	}
	for(int i=2;i<=n;i++)
	{
		int minc=INF;
		int p=-1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&minc>lowc[j])
			{
				minc=lowc[j];
				p=j;
			}
		}
		if(minc==INF)
			return -1;
		ans+=minc;
		vis[p]=true;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&lowc[j]>cost[p][j])
				lowc[j]=cost[p][j];
		}
	}
	return ans;
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
	while(scanf("%d",&n)==1)
	{
		for(int i=1;i<=n;i++)
			lowc[i]=i;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
			{
				scanf("%d",&cost[i][j]);
			}
		printf("%d\n",Prim());
	}
    return 0;
}

K -  The Unique MST 题目链接

此题错了5次。。

#include 
#include 
#include 
#include 
#include 
using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=109;
bool vis[MAXN];
int lowc[MAXN];
int pre[MAXN];
int Max[MAXN][MAXN];
bool used[MAXN][MAXN];

int prim(int cost[][MAXN],int n)
{
	int ans=0;
	memset(vis,false,sizeof(vis));
	memset(Max,0,sizeof(Max));
	memset(used,false,sizeof(used));
	vis[0]=true;
	pre[0]=-1;
	for(int i=1;ilowc[j])
			{
				minc=lowc[j];
				p=j;
			}
		}
		if(minc==INF)
			return -1;
		ans+=minc;
		vis[p]=true;
		used[p][pre[p]]=used[pre[p]][p]=true;
		for(int j=0;jcost[p][j])
			{
				lowc[j]=cost[p][j];
				pre[j]=p;
			}
		}
	}
	return ans;
}

int Prim(int cost[][MAXN],int n)
{
	double ans=0;
	memset(vis,false,sizeof(vis));
	memset(lowc,0,sizeof(lowc));
	vis[0]=true;
	for(int i=1;ilowc[j])
			{
				minc=lowc[j];
				p=j;
			}
		}
		if(minc==INF)
			return -1;
		ans+=minc;
		vis[p]=true;
		for(int j=0;jcost[p][j])
				lowc[j]=cost[p][j];
		}
	}
	return ans;
}

void init(int cost[][MAXN],int n)
{
	for(int i=0;i

L -  还是畅通工程 题目链接

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=109;
bool vis[MAXN];
int lowc[MAXN];
int cost[MAXN][MAXN];
int n;

int Prim()
{
	int ans=0;
	memset(vis,0,sizeof(vis));
	vis[1]=true;
	for(int i=2;i<=n;i++)
	{
		lowc[i]=cost[1][i];
	}
	for(int i=2;i<=n;i++)
	{
		int minc=INF;
		int p=-1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&minc>lowc[j])
			{
				minc=lowc[j];
				p=j;
			}
		}
		if(minc==INF)
			return -1;
		ans+=minc;
		vis[p]=true;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&lowc[j]>cost[p][j])
				lowc[j]=cost[p][j];
		}
	}
	return ans;
//	printf("%d\n",ans);
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
	while(scanf("%d",&n)==1)
	{
		if(n==0)
			break;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
			{
				if(i==j)
					cost[i][j]=0;
				else
					cost[i][j]=INF;
			}
		for(int i=0;itime)
				cost[a][b]=cost[b][a]=time;
		}
		printf("%d\n",Prim());
	}
    return 0;
}

M -  Jungle Roads 题目链接

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=109;
bool vis[MAXN];
int lowc[MAXN];
int cost[109][109];


int Prim(int n)
{
	int ans=0;
	memset(vis,0,sizeof(vis));
	vis[0]=true;
	for(int i=1;ilowc[j])
			{
				minc=lowc[j];
				p=j;
			}
		}
		if(minc==INF)
			return -1;
		ans+=minc;
		vis[p]=true;
		for(int j=0;jcost[p][j])
				lowc[j]=cost[p][j];
		}
	}
	return ans;
}

void init(int n)
{
	for(int i=0;i

N -  畅通工程再续 题目链接
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const double INF=0x3f3f3f3f;
const int MAXN=109;
bool vis[MAXN];
double lowc[MAXN];
double cost[109][109];

struct node
{
	double x,y;
}s[109];

double Prim(int n)
{
	double ans=0;
	memset(vis,false,sizeof(vis));
	vis[1]=true;
	for(int i=2;i<=n;i++)
		lowc[i]=cost[1][i];
	for(int i=2;i<=n;i++)
	{
		double minc=INF;
		int p=-1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&minc>lowc[j])
			{
				minc=lowc[j];
				p=j;
			}
		}
		if(minc==INF)
			return -1;
		if(minc>1000||minc<10)
		{
			return -1;
		}
		ans+=minc;
		vis[p]=true;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&lowc[j]>cost[p][j])
				lowc[j]=cost[p][j];
		}

	}
	return ans;
}

void init(int n)
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cost[i][j]=cost[j][i]=INF;
}

int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		{
			scanf("%lf%lf",&s[i].x,&s[i].y);
		}
		init(n);
		int k=0;
		for(int i=1;i<=n;i++)
		{
			for(int j=i+1;j<=n;j++)
			{
				double time=sqrt((s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y));
				if(cost[i][j]>time&&time<=1000&&time>=10)
					cost[i][j]=cost[j][i]=time;
			}
		}
		if(Prim(n)==-1)
			printf("oh!\n");
		else
		{
			printf("%.1lf\n",Prim(n)*100.0);
		}
	}	
    return 0;
}



你可能感兴趣的:(kuangbin系列)