poj 1789 Truck History(prim算法)
2013-07-03 16:31
369 查看
未优化版本
优化版本
/*prim算法实现*/ #include <iostream> //#include <fstream> using namespace std; #define MAX 2001 #define INF 0xffff /*15988K 500MS*/ //var int n; char a[MAX][10]; int sum;//代表生成树的长度 int m[MAX][MAX]; //fstream fin; //fuction int GetDis(int x,int y); void cal(); void prim(int u); int main() { //fin.open("1789.txt",ios::in); while(cin>>n) { if(n==0) break; sum=0; for(int i=0;i<n;i++) cin>>a[i]; //初始化距离为0 memset(m,0,sizeof(m)); cal(); prim(0); cout<<"The highest possible quality is "<<"1/"<<sum<<"."<<endl; } system("pause"); return 0; } //计算每一对类型的距离 void cal() { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) m[i][j]=GetDis(i,j); } } //计算一对顶点的代码 int GetDis(int x,int y) { int count=0; for(int i=0;i<7;i++) if(a[x][i]!=a[y][i]) ++count; return count; } //prim算法 void prim(int u) { int *lowset=new int ; bool *s=new bool ; //初始化 for(int i=0;i<n;i++) { if(u!=i) { lowset[i]=m[u][i]; s[i]=false; } } int q; s[u]=true; for(int i=0;i<n-1;i++) { //找到最小的lowest int min=INF; for(int j=0;j<n;j++) { if(lowset[j]<min&&(!s[j])) { q=j; min=lowset[j]; } } //更新s,lowest sum+=min; s[q]=true; for(int j=0;j<n;j++) { if(m[q][j]<lowset[j]&&(!s[j])) { lowset[j]=m[q][j]; } } } delete []lowset; delete []s; }
优化版本
/*prim算法*/ #include <iostream> //#include <fstream> using namespace std; #define MAX 2001 #define INF 0xffff /*356K 407MS*/ int n; char a[MAX][8]; int sum; //fstream fin; void prim(int u); int GetDis(int x,int y); int main() { //fin.open("1789.txt",ios::in); while(cin>>n) { if(n==0) break; sum=0; for(int i=0;i<n;i++) cin>>a[i]; prim(0); cout<<"The highest possible quality is "<<"1/"<<sum<<"."<<endl; } system("pause"); return 0; } int GetDis(int x,int y) { int count=0; for(int i=0;i<7;i++) if(a[x][i]!=a[y][i]) ++count; return count; } void prim(int u) { int *lowset=new int ; bool *s=new bool ; //初始化程序 for(int i=0;i<n;i++) { if(u!=i) { lowset[i]=GetDis(u,i); s[i]=false; } } int q; s[u]=true; for(int i=0;i<n-1;i++) { //计算出最小值 int min=INF; for(int j=0;j<n;j++) { if(min>lowset[j]&&!s[j]) { q=j; min=lowset[j]; } } s[q]=true; sum+=min; //更新lowset for(int j=0;j<n;j++) { if(GetDis(q,j)<lowset[j]&&!s[j]) lowset[j]=GetDis(q,j); } } }
相关文章推荐
- poj1789 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算法求最小生成树)
- poj1789 Truck History ——最小生成树入门题_Prim算法
- POJ 1789 ——Truck History 最小生成树 prim算法
- 【最小生成树之prim算法】POJ 1789---Truck History
- poj--1789 Truck History(最小生成树Prim算法)
- POJ_1789(Truck History )(最小生成树(普里姆prim算法))
- poj 1789 Truck History
- poj 1789 Truck History 最小生成树
- poj 1789 Truck History(Prim)
- poj 1789 Truck History(prim)
- Poj 1789 Truck History
- POJ 1789 Truck History
- POJ 1789 Truck History(构造最小生成树)
- POJ_1789(Prim算法)