您的位置:首页 > 其它

POJ 1789 Truck History

2008-11-20 15:47 429 查看
这道题目,用前面的prim算法,就会超时,所以需要寻找更加高性能的prim算法,包括
1.string输入的优化
2.去掉vector<int>

#include<iostream>

#include<cstdio>

#include<vector>

#include<string>

#include <cstdlib>

using namespace std;

const int MAX = 2001;

const int INF = 100;

int c[MAX][MAX];

int closet[MAX];//记录的是V-U集合连接到U集合中,最小的边,包含在U中的顶点

int lowcost[MAX];

char ss[MAX][7];

bool flag[MAX];

int Prim(int n)

{

int i, j, k, ans = 0, pair = 0;

flag[1] = true;

for(i = 2; i <= n; i++)

{

lowcost[i] = c[1][i];

closet[i] = 1;

flag[i] = false;

}

for(i = 1; i < n; i++)

{

j = 1;

int min = INF;

//遍历V-U集合,找到最小的lowcost

for(k = 2; k <=n; k++)

{

if(lowcost[k] < min && !flag[k])

{

min = lowcost[k];

j = k;

}

}

flag[j] = true;

//j<--->closet[j]表示新加入的这条边的长度

ans += c[j][closet[j]];

//重新计算V-U集合 到 U集合之间的 lowcost

for(k = 2; k <= n; k++)

{

if(c[j][k] < lowcost[k] && !flag[k])

{

lowcost[k] = c[j][k];

//为以后加入到U集合预先准备 k<--->closet[k]表示新加入的一条边

closet[k] = j;

}

}

}

return ans;

}

int getDist(char* s1,char* s2) {

int count = 0;

for(int i=0;i<7;i++) {

if(s1[i]!=s2[i])

count++;

}

return count;

}

int main() {

int i, j, n, m;

cin>>n;

while(n!=0) {

for(i = 1; i <= n; i++)

{

//ss[i] = (char *)malloc(7);

scanf("%s",&ss[i]);

}

for(i=1;i<=n;i++)

for(j=i+1;j<=n;j++) {

int dd = getDist(ss[i],ss[j]);

c[i][j] = dd;

c[j][i] = dd;

}

cout<<"The highest possible quality is 1/"<<Prim(n)<<"."<<endl;

memset(flag,0,sizeof(flag));

memset(closet,0,sizeof(closet));

memset(lowcost,0,sizeof(lowcost));

cin>>n;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: