http://poj.org/problem?id=1789
傻逼题犯了傻逼错误。。。。
给你n个字符串
每2个字符串之间的 不同字母个数表示两个字符串的dis距离
把字符串看作点,距离看作边权,求这个最小生成树的权值和
把mini写成minn 了wa了几次。。。。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
int inf=15;
double eps=0.000001;
int n,m;
char mp[2005][10];
int tm[2005][2005];
int get_dis(char *s1,char *s2)
{
int ret=0;
for (int i=0;i<7;i++)
{
if (s1[i]!=s2[i]) ret++;
}
return ret;
}
int main()
{
int i,j;
while(cin>>n)
{
// getchar();
memset(tm,0,sizeof(tm));
if (!n) break;
for (i=1;i<=n;i++)
{
cin>>mp[i];
}
for (i=1;i<=n;i++)
{
for (j=i+1;j<=n;j++)
{
tm[i][j]=tm[j][i]=get_dis(mp[i],mp[j]);
}
}
int dis[2005];
memset(dis,0,sizeof(dis));
dis[1]=0;
for (i=2;i<=n;i++)
dis[i]=tm[1][i];
int ans=0;
for (i=1;i<n;i++)
{
int minn=inf;
int mini;
for (j=2;j<=n;j++)
{
if (dis[j]!=0&&dis[j]<minn)
{
minn=dis[j];mini=j;
}
}
dis[mini]=0;
ans+=minn;
for (j=2;j<=n;j++)
{
if (dis[j]&&tm[mini][j]<dis[j])
dis[j]=tm[mini][j];
}
}
printf("The highest possible quality is 1/%d.\n", ans);
}
return 0;
}