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;
}
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;
}
相关文章推荐
- 初级->图算法->最小生成树 poj 1789 Truck History
- poj 1789 Truck History 最小生成树
- POJ 1789 Truck History
- poj 1789 Truck History
- POJ1789 Truck History(最小生成树)
- Truck History--POJ 1789
- poj 1789 Truck History
- Truck History 【POJ--1789】【普里姆&&克鲁斯卡尔】【邻接矩阵】
- POJ 1789 - Truck History(最小生成树)
- poj 1789 Truck History 【prim & kruskal】
- Poj 1789 Truck History【最小生成树】
- POJ1789 Truck History
- POJ 一 1789 Truck History(最小生成树)
- poj 1789 Truck History(java + prim)
- POJ 1789 Truck History
- poj 1789 Truck History (普里姆算法)
- POJ1789 Truck History(prim)
- Truck History - poj 1789 (Prim 算法)
- poj 1789 Truck History(Prim)(中等)
- POJ_1789 Truck History