Source Code
Problem: 1789 | User: fan1913068672 | |
Memory: 15696K | Time: 625MS | |
Language: C++ | Result: Accepted |
- Source Code
#include"iostream" #include"cstdio" #include"cstring" using namespace std; const int INF = 7777; char str[2001][10]; int G[2001][2001]; int visit[2001]; struct Edge{ int st; int len; }Edges[2001]; int n; int check(int str1,int str2){ int ans = 0; for(int i=0;str[str1][i];i++){ if(str[str1][i]!=str[str2][i]) ans++; } return ans; } int prim(int start){ int sum = 0; for(int i=0;i<n;i++){ Edges[i].len = INF; Edges[i].st = start; } visit[start] = 1; for(int i=0;i<n-1;i++){ for(int j=0;j<n;j++){ int len = G[start][j]; if(!visit[j]&&len<Edges[j].len){ Edges[j].len = len; Edges[j].st = start; } } int Min = INF; int Min_ed; for(int j=0;j<n;j++){ if(!visit[j]&&Edges[j].len<Min){ Min = Edges[j].len; Min_ed = j; } } start = Min_ed; visit[start] = 1; sum+=Min; } return sum; } int main(){ while(cin>>n&&n){ for(int i=0;i<n;i++){ visit[i] = 0; } for(int i=0;i<n;i++){ scanf("%s",str[i]); } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ G[i][j] = check(i,j); } } int ans = prim(0); cout<<"The highest possible quality is 1/"<<ans<<"."<<endl; } return 0; }