poj-1789-Truck History
2012-11-15 13:46
253 查看
题意:
先给你一个N,然后给你N组字符串。
两个字符串之间的距离就是两个字符串之间不同字符的个数。
让你链接所有的字符串的最小距离。
做法:
把每一个字符串当成一个节点,两个节点之间的权值即为距离。然后求链接所有节点的最小生成树。
据说用prim算法求稠密图,可是我用的是克鲁斯卡尔。。。嘿嘿】
不过得优化一下才能过,不然会超时的。
先给你一个N,然后给你N组字符串。
两个字符串之间的距离就是两个字符串之间不同字符的个数。
让你链接所有的字符串的最小距离。
做法:
把每一个字符串当成一个节点,两个节点之间的权值即为距离。然后求链接所有节点的最小生成树。
据说用prim算法求稠密图,可是我用的是克鲁斯卡尔。。。嘿嘿】
不过得优化一下才能过,不然会超时的。
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; struct list { int x; int y; int len; }dist[4000001]; int num; int cmp(struct list a,struct list b) { return a.len<b.len; } int len(char x[],char y[]) { int sum=0,i; for(i=0;i<7;i++) { if(x[i]!=y[i])sum++; } return sum; } void init(int n) { int i,j; char str[2001][10]; for(i=0;i<n;i++) { cin>>str[i]; } num=0; for(i=0;i<n;i++) { for(j=0;j<i;j++) { dist[num].x=i; dist[num].y=j; dist[num++].len=len(str[i],str[j]); } } } int fx[10000]; int f(int x) { while(x!=fx[x]) x=fx[x]; return x; } int main() { int n,i; while(scanf("%d",&n)&&n) { init(n); for(i=0;i<n;i++) { fx[i]=i; } sort(dist,dist+num,cmp); int hi=0; int leaps=0; for(i=0;i<num;i++) { if(f(dist[i].x)!=f(dist[i].y)) { hi+=dist[i].len; fx[f(dist[i].x)]=f(dist[i].y); leaps++; } if(leaps==n-1)break;//用leaps优化,当选到的边为n-1条的时候,所有的点都链接到了 } printf("The highest possible quality is 1/%d.\n",hi); } return 0; }
相关文章推荐
- poj 1789 Truck History
- poj 1789 Truck History
- POJ1789--Truck History
- poj1789 Truck History 最小生成树
- POJ1789 Truck History 【最小生成树Prim】
- POJ 1789 Truck History
- POJ 1789 Truck History
- POJ 1789 Truck History【kruskal】
- poj1789 Truck History (最小生成树)
- POJ 1789:Truck History(prim&&最小生成树)
- poj-1789--Truck History-最小生成数
- POJ 1789 Truck History
- 【最小生成树】+【并查集】-POJ-1789-Truck History
- POJ 1789 Truck History 最小生成树 kruskal && Prim
- POJ 1789 Truck History 【最小生成树&&Kruskal】
- POJ-1789 Truck History(prim算法,最小生成树)
- POJ 1789 Truck History
- poj 1789 Truck History (普里姆算法)
- POJ1789 Truck History(prim)
- poj1789 - Truck History