题意很简单 主要是想练一下优先队列的使用
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
bool vis[2100];
int m;//点的个数
char tu[2105][8];
struct node
{
node(int i=0,int j=0,int k=0):a(i),b(j),len(k){}//构造函数
int a,b,len;
};
struct cmp{ bool operator()(const node&a,const node&b) {return a.len>b.len;} };//比较函数类
int cal(int i,int j)//计算2个字串的距离
{
int ans=0,ii=-1;
while(++ii<7)
if(tu[i][ii]!=tu[j][ii])
ans++;
return ans;
}
void read()
{
for(int i=0;i<m;i++)
scanf("%s",tu[i]);
}
void deal()//prim算法
{
priority_queue<node,vector<node>,cmp>* que=new priority_queue<node,vector<node>,cmp>;
memset(vis,0,sizeof(vis));
int num=0,ans=0,e=0;
node temp;
while(++num<m)//加入n-1条边
{
vis[e]=1;//加入一个点
for(int i=0;i<m;i++)//加入新的边
if(!vis[i]&&i!=e)
que->push( node(i,e,cal(e,i)) );
while(vis[e])//找到合适的最短边
{
temp=que->top();que->pop();
e=temp.a;
if(!vis[temp.b]) e=temp.b;
}
ans+=temp.len;//加上距离
}
delete que;
printf("The highest possible quality is 1/%d.\n",ans);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(cin>>m,m)
{
read();
deal();
}
return 0;
}
本文通过一个简单的实例介绍如何使用优先队列实现Prim最小生成树算法,该算法用于求解带权无向图的最小生成树问题。文章提供了一个完整的C++代码示例,并详细解释了每一步的操作。
569

被折叠的 条评论
为什么被折叠?



