poj 1789 Truck History(prim算法)

来源:互联网 发布:c盘中的windows大小 编辑:程序博客网 时间:2024/05/18 03:58

未优化版本

/*prim算法实现*/ #include <iostream>//#include <fstream>using namespace std;#define MAX 2001#define INF 0xffff/*15988K500MS*///varint n;char a[MAX][10];int sum;//代表生成树的长度int m[MAX][MAX];//fstream fin;//fuctionint  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[n];     bool *s=new bool[n];          //初始化     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/*356K407MS*/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[n];     bool *s=new bool[n];     //初始化程序          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);             }      }}


原创粉丝点击