POJ 1789 Truck History(Prim)

版权声明:听说这里让写版权声明~~~ https://blog.csdn.net/m0_37691414/article/details/82083323

解析:找到一条连接所有truck的最短路径。典型的最小生成树的问题。求最小生成树的最段路径问题。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 2010;
int e[N][N], dis[N];
bool visit[N];
char str[N][10];
int n;
int main(){
	while(~scanf("%d", &n), n){
		fill(dis, dis + N, INF);
		fill(e[0], e[0] + N*N, INF);
		memset(visit, false, sizeof(visit));
		for(int i = 1; i <= n; ++i)
			scanf("%s", str[i]);
		for(int i = 1; i < n; ++i)
			for(int j = i + 1; j <= n; ++j){
				int cnt = 0;
				for(int k = 0; k < 7; ++k)
					if(str[i][k] != str[j][k])	cnt++;
				e[i][j] = e[j][i] = cnt;
			}
		dis[1] = 0;
		int sum = 0;
		for(int i = 0; i < n; ++i){
			int u = -1, minn = INF;
			for(int j = 1; j <= n; ++j)
				if(visit[j] == false && dis[j] < minn){
					minn = dis[j];
					u = j;
				}
			if(u == -1)	break;
			visit[u] = true;
			sum += minn;
			for(int v = 1; v <= n; ++v)
				if(visit[v] == false && dis[v] > e[u][v]){
					dis[v] = e[u][v];
				}
		}
		printf("The highest possible quality is 1/%d.\n", sum);
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/m0_37691414/article/details/82083323