poj Truck History(最小生成树)

给你一个n;
n个长为7的字符串;
每个字符串表示一个节点,每个节点向其他所有点都有边,边长为两个节点字符串同一位置不同字符的数量;
需要你生成最短路的边权和。

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define INF 0x3f3f3f3f
int mp[2005][2005];
char str[2005][8];
int n;
void change(){
	for(int i=0;i<n;i++){
		
		for(int j=i+1;j<n;j++){
			int sum=0;
			for(int k=0;k<7;k++){
				if(str[i][k]!=str[j][k])
				sum++;
			}
			mp[i][j]=mp[j][i]=sum;
		}
	}
}
int prim(int st){
	int vis[2005];
	int low[2005];
	int mincost=0;
	memset(vis,0,sizeof(vis));
	vis[st]=1;
	for(int i=0;i<n;i++){
		low[i]=mp[st][i];
	}
	low[st]=0;
	for(int i=0;i<n-1;i++)
	{
		int minn=INF;
		int u=-1;
		for(int j=0;j<n;j++){
			if(minn>low[j]&&!vis[j]){
				minn=low[j];
				u=j;
			}
		}
		if(minn==INF)return -1;
		vis[u]=1;
		mincost+=minn;
		
		for(int k=0;k<n;k++){
			if(!vis[k]&&low[k]>mp[u][k])
			{
				low[k]=mp[u][k];
			}
		}
	}
	return mincost;
}
int main(){

	while(scanf("%d",&n)&&n){
		for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
		mp[i][j]=(i==j?0:INF);
		for(int i=0;i<n;i++){
			scanf("%s",str[i]);	
		}	
		change();		
		printf("The highest possible quality is 1/%d.\n",prim(0));
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/l2533636371/article/details/80171975