POJ1789--Truck History
2015-04-10 19:22
246 查看
题意大概是这样的:用一个7位的string代表一个编号,两个编号之间的distance代表这两个编号之间不同字母的个数。一个编号只能由另一个编号“衍生”出来,代价是这两个编号之间相应的distance,现在要找出一个“衍生”方案,使得总代价最小,也就是distance之和最小。
例如有如下4个编号:
aaaaaaa
baaaaaa
abaaaaa
aabaaaa
显然的,第二,第三和第四编号分别从第一编号衍生出来的代价最小,因为第二,第三和第四编号分别与第一编号只有一个字母是不同的,相应的distance都是1,加起来是3。也就是最小代价为3。
问题可以转化为最小代价生成树的问题。因为每两个结点之间都有路径,所以是完全图。
此题的关键是将问题转化为最小生成树的问题。每一个编号为图的一个顶点,顶点与顶点间的编号差即为这条边的权值,题目所要的就是我们求出最小生成树来。这里我用prim算法来求最小生成树。
例如有如下4个编号:
aaaaaaa
baaaaaa
abaaaaa
aabaaaa
显然的,第二,第三和第四编号分别从第一编号衍生出来的代价最小,因为第二,第三和第四编号分别与第一编号只有一个字母是不同的,相应的distance都是1,加起来是3。也就是最小代价为3。
问题可以转化为最小代价生成树的问题。因为每两个结点之间都有路径,所以是完全图。
此题的关键是将问题转化为最小生成树的问题。每一个编号为图的一个顶点,顶点与顶点间的编号差即为这条边的权值,题目所要的就是我们求出最小生成树来。这里我用prim算法来求最小生成树。
#include<iostream> #include<cstdio> #include<cstring> #include<string.h> #include<algorithm> #define inf 0x6fffff #define MAX 100000 using namespace std; int visit[2222],i,m,j,map[2111][2111],dis[2222],k,n,count,ok; char s[2222][8]; int prime() { memset(visit,0,sizeof(visit)); for(i=1; i<=m; i++) { dis[i]=map[1][i]; } visit[1]=1; int count=0,flag=1; for(i=1; i<m; i++) { int min=MAX; k=0; for(j=1; j<=m; j++) { if(!visit[j]&&min>dis[j]) { min=dis[j]; k=j; } } /* if(min==MAX) { printf("?\n"); flag=0; break; }*/ //这里判断是否有不能生成的情况 visit[k]=1; count+=min; for(j=1; j<=m; j++) { if(!visit[j]&&dis[j]>map[k][j]) dis[j]=map[k][j]; } } if(flag) printf("The highest possible quality is 1/%d.\n",count); } int main() { int n,i,j,k; while(scanf("%d",&m)!=EOF) { if(m==0) break; for(i=1;i<=m;i++) for(j=1;j<=m;j++) map[i][j]=inf; memset(s,0,sizeof(s)); for(i=1;i<=m;i++) scanf("%s",&s[i]); for(i=1;i<=m;i++) for(j=i+1;j<=m;j++) {int sum=0; if(i==j) continue; else { for(k=0;k<7;k++) if(s[i][k]!=s[j][k]) sum++; if(map[i][j]>sum) map[i][j]=map[j][i]=sum; } } prime(); } }
相关文章推荐
- POJ 1789:Truck History(prim&&最小生成树)
- poj1789 Truck History
- poj 1789 Truck History
- POJ ~ 1789 ~ Truck History (最小生成树)
- Truck History 【POJ--1789】【普里姆&&克鲁斯卡尔】【邻接矩阵】
- POJ 1789 Truck History
- Poj 1789 Truck History【最小生成树】
- poj 1789 Truck History
- POJ 1789 Truck History 最小生成树
- poj1789——Truck History(最小生成树+prim)
- POJ 1789 Truck History
- poj 1789 Truck History
- poj 1789 Truck History(最小生成树模板题)
- POJ1789 Truck History【Prim】
- POJ 1789 Truck History (Prim Algorithm)
- POJ 题目1789 Truck History(最小生成树)
- poj 1789 Truck History
- poj 1789 Truck History 最小生成树
- poj 1789 Truck History(prim)
- poj-1789--Truck History-最小生成数