poj 1789 最小生成树
1A,在POJ上好久没有1A了。。
算法:
裸的最小生成树,关键时认真读懂题意。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; struct node { int a, b, num; bool operator < ( const node& A) const { return num < A.num; } }edge[4100000]; char truck[2100][10]; int N, e, set[2100]; int Dif( char *str, char *sts) { int num = 0; for( int i = 0; i < 7; i++) if( str[i] != sts[i] ) num++; return num; } int find( int x ) { return x == set[x] ? x : set[x] = find(set[x]); } void merge( int x, int y) { set[x] = y; } void Krusal( ) { int sum = 0; sort( edge, edge + e); for( int i = 0; i < e; i++) { int x = find(edge[i].a); int y = find(edge[i].b); if( x != y ) { merge(x, y); sum += edge[i].num; } } printf("The highest possible quality is 1/%d.\n",sum); } int main( ) { while( scanf("%d",&N), N) { e = 0; for( int i = 1; i <= N; i++) { scanf("%s",truck[i]); set[i] = i; } for( int i = 1; i <= N; i++) { for( int j = i + 1; j <= N; j++) { int x = Dif(truck[i], truck[j]); edge[e].a = i; edge[e].b = j; edge[e++].num = x; } } Krusal(); } return 0; }
posted on 2012-07-12 09:33 more think, more gains 阅读(142) 评论(0) 编辑 收藏 举报