POJ 1789 -- Truck History(Prim)
POJ 1789 -- Truck History
Prim求分母的最小。即求最小生成树
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn = 2000 + 10; 6 const int INF = 1000000; 7 int n;//有几个卡车 8 char str[maxn][10]; 9 int d[maxn];//记录编号的数值 10 int Edge[maxn][maxn]; 11 int dist[maxn]; 12 void prim() 13 { 14 int sum=0; 15 //加入源点 16 dist[0] = -1; 17 for(int i=1;i<n;i++) 18 { 19 dist[i] = Edge[0][i]; 20 } 21 22 for(int i=1;i<n;i++)//依次加入n-1条边 23 { 24 int min = INF,pos; 25 for(int j=1;j<n;j++)//找出最小的一条 26 { 27 if(min>dist[j] && dist[j]!=-1) 28 { 29 min = dist[j];pos = j; 30 } 31 } 32 //将pos加入 33 dist[pos] = -1;sum+=min; 34 //进行路径的更新 35 for(int k=1;k<n;k++) 36 { 37 if(dist[k] > Edge[pos][k]) 38 dist[k]=Edge[pos][k]; 39 } 40 } 41 cout<<"The highest possible quality is 1/"<<sum<<"."<<endl; 42 } 43 44 int main() 45 { 46 while(cin>>n && n) 47 { 48 for(int i=0;i<n;i++) 49 { 50 cin>>str[i]; 51 } 52 for(int i=0;i<n;i++) 53 { 54 int num=0; 55 for(int k=0;k<7;k++) 56 num += (int)(str[i][k] - 'a'); 57 d[i] = num; 58 } 59 memset(Edge,0,sizeof(Edge)); 60 for(int i=0;i<n;i++) 61 { 62 for(int j=i+1;j<n;j++) 63 { 64 int temp = 0; 65 for(int k=0;k<7;k++) 66 { 67 temp += str[i][k]!=str[j][k]; 68 } 69 Edge[i][j] = Edge[j][i] = temp; 70 } 71 } 72 memset(dist,INF,sizeof(dist)); 73 prim(); 74 75 } 76 77 78 return 0; 79 }