文章标题 POJ 1789 :Truck History (最小生成树+prim)
2017-07-26 18:53
411 查看
Truck History
传送门题意:有n辆车,每辆车有一个7个字符的编号,然后一辆车车可以衍生出另一辆车,所花费的代价是两辆车中的编号对应字符不一样的数目,然后要求第一辆衍生出第2~第n辆车所需要的最小花费。
分析:题意有点难理解,其实就是求最小生成树,计算任意两个点之间的距离,然后直接用prim算法就行了。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <queue> #include <set> #include <map> #include <algorithm> #include <math.h> #include <vector> using namespace std; const int inf = 100; const int maxn = 2005; char str[maxn][10];//字符串 int dis[maxn][maxn];//两点之间的距离 int vis[maxn];//记录某顶点是否属于最小生成树 int lowdis[maxn];//各个源点到其它点的最短路 int n; int Val(int a,int b){//返回两个点的值 int cnt=0; for (int i=0;i<7;i++){ if (str[a][i]!=str[b][i])cnt++; } return cnt; } int prim(int st){ memset (vis,0,sizeof (vis)); memset (lowdis,inf,sizeof (lowdis)); vis[st]=1; int sum=1; int ans=0; while (1){ if (sum==n)break; int tmp_min=inf; int place=-1; for (int i=2;i<=n;i++){ if (vis[i]==0&&lowdis[i]>dis[st][i]){//当前点还不是最小生成数的点遇到更短的边值更新 lowdis[i]=dis[st][i]; } if (vis[i]==0&&tmp_min>lowdis[i]){//保存最小的边的距离和所对应的点 tmp_min=lowdis[i]; place=i; } } st=place;//顶点i与旧源点合并 vis[place]=1;//将点放进最小生成树 ans+=tmp_min;//最小生成树的权值加上 sum++;//点加上1 } return ans; } int main() { while (scanf ("%d",&n)&&n){ for(int i=1;i<=n;i++){ scanf ("%s",str[i]); } for (int i=1;i<n;i++){ for (int j=i+1;j<=n;j++){ dis[i][j]=dis[j][i]=Val(i,j); } } // for (int i=1;i<=n;i++){ // for (int j=1;j<=n;j++){ // printf ("%d ",dis[i][j]); // } // printf ("\n"); // } printf ("The highest possible quality is 1/%d.\n",prim(1)); } return 0; }
相关文章推荐
- poj 1789 Truck History 最小生成树(prim)
- poj 1789 Truck History 最小生成树 prim 难度:0
- POJ1789 Truck History(Prim最小生成树)
- POJ1789 Truck History 【最小生成树Prim】
- POJ1789,Truck History,最小生成树,Prim
- POJ 1789 Truck History 最小生成树 prim
- POJ 1789:Truck History(prim&&最小生成树)
- poj 1789 Truck History(最小生成树 Prim)
- POJ 1789 Truck History (最小生成树 Prim)
- poj 1789--Truck History 最小生成树(prim)
- POJ 1789 Truck History (prim解决最小生成树问题)
- POJ 1789 Truck History (最小生成树---prim)
- poj1789——Truck History(最小生成树+prim)
- POJ 1789:Truck History:典型prim最小生成树(1)
- POJ 1789 Truck History(最小生成树-Prim)
- POJ 1789:Truck History(prim&&最小生成树)
- poj 1789 Truck History(最小生成树 prim)
- POJ1789 Truck History(prim最小生成树)
- POJ 1789 Truck History 最小生成树 kruskal && Prim
- POJ - 1789 Truck History(最小生成树简单题)