poj 1789 Truck History 最小生成树
2014-04-30 04:14
253 查看
题目地址:poj1789
就是找到一棵树吧。
由于difference是互相的,所以建立无向图。
记得kruskal cc==1时break , 增加边的时候,记得不要重复添加
还是985ms 险过,据说prim会快一点?
代码:
就是找到一棵树吧。
由于difference是互相的,所以建立无向图。
记得kruskal cc==1时break , 增加边的时候,记得不要重复添加
还是985ms 险过,据说prim会快一点?
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<cstdio> #include<algorithm> #include<cstring> #include<string> const double eps=1e-8; using namespace std; struct edge { int u; int v; int w; }; edge e[4000010]; int fa[2005]; int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);} bool edge_cmp(edge a,edge b) { return a.w<b.w; } int n,m; int cc; double kruskal() { double ans=0; sort(e,e+m,edge_cmp); for(int i=0;i<m;i++) { if(cc==1) break; int x=find(e[i].u); int y=find(e[i].v); if(x!=y) { fa[x]=y; ans+=e[i].w; cc--; } } return ans; } void init() { for(int i=0;i<n;i++) { fa[i]=i; } cc=n; } int calc_difference(char* a,char * b) { int ans=0; for(int i=0;i<7;i++) { if(a[i]!=b[i]) ans++; } return ans; } string s[2005]; char c[2005][15]; int main() { while(cin>>n) { if(!n) break; init(); for(int i=0;i<n;i++) { scanf("%s",c[i]); } int cnt=0; for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) { e[cnt].u=i; e[cnt].v=j; e[cnt].w=calc_difference(c[i],c[j]); cnt++; } m=cnt; int ans=kruskal(); printf("The highest possible quality is 1/%d.\n",ans); } }
相关文章推荐
- 最小生成树--Truck History(poj 1789);
- POJ 1789-Truck History(最小生成树-不同字母个数)
- poj1789 Truck History 最小生成树
- poj1789 Truck History (最小生成树)
- poj 1789 Truck History 【最小生成树】
- POJ 1789 Truck History 【最小生成树&&Kruskal】
- POJ 1789 - Truck History(最小生成树)
- POJ 1789 Truck History(最小生成树,prim算法)
- POJ1789 Truck History 最小生成树
- POJ1789 Truck History(最小生成树)
- POJ 1789 Truck History (Prim算法求最小生成树)
- POJ 1789 Truck History(最小生成树)
- poj1789 Truck History 最小生成树,kruskal
- POJ 1789 Truck History【最小生成树简单应用】
- 文章标题 POJ 1789 :Truck History (最小生成树+prim)
- POJ 1789 Truck History(构造最小生成树)
- POJ1789--Truck History(最小生成树)
- 【最小生成树之prim算法】POJ 1789---Truck History
- POJ 1789 Truck History(最小生成树--prime)
- POJ 1789 Truck History 最小生成树