概述
例题1:QS网络(QS Network)
题意:若两个QS之间要想连网,除了它们间网线的费用外,两者都要买适配器, 求使所有的QS都能连网的最小费用。
分析:这个除了边的权值外,顶点也有权值,因此要想求最小价值,必须算边及顶点的权值和。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define maxint 0x3f3f3f3f
#define MAXN 110
int n;
int map[MAXN][MAXN];
int adapter[1010];///存储适配器的价格
int visited[MAXN];
int lowcost[MAXN];
void init()
{
int i,k;
for(i=0;i<n;i++)
scanf("%d",&adapter[i]);
for(i=0;i<n;i++)
{
for(k=0;k<n;k++)
{
scanf("%d",&map[i][k]);
if(i==k)
map[i][k]=maxint;
else
map[i][k]+=adapter[i]+adapter[k];///网线加上两个适配器的价格
}
}
}
int prim()
{
int i,j;
int min,sumweight=0,pos;
memset(visited,0,sizeof(visited));
visited[1]=1;
pos=1;
for(i=0;i<n;i++)
if(i!=pos)
lowcost[i]=map[pos][i];
for(i=0;i<n-1;i++)
{
min=maxint;
for(j=0;j<n;j++)
if(visited[j]==0&&lowcost[j]<min)
{
min=lowcost[j];
pos=j;
}
sumweight+=min;
visited[pos]=1;
for(j=0;j<n;j++)
if(visited[j]==0&&map[pos][j]<lowcost[j])
lowcost[j]=map[pos][j];
}
return sumweight;
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(map,maxint,sizeof(map));
scanf("%d",&n);
init();
int ans=prim();
cout<<ans<<endl;
}
return 0;
}
例题二 卡车的历史(Truck History)
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define maxint 0x3f3f3f
#define MAXN 2000
int n;
char codes[MAXN][10];
int map[MAXN][MAXN];
int lowcost[MAXN];
int visited[MAXN];
void init()
{
int i,j,k;
int dist;
for(i=0;i<n;i++)///任意两个字符串的不同
{
for(j=i+1;j<n;j++)
{
dist=0;
for(k=0;k<7;k++)
if(map[i][k]!=map[j][k])
dist++;
map[i][j]=dist;
map[j][i]=dist;
}
}
}
int prim()
{
int i,j;
int min,sumweight=0,pos;
memset(lowcost,0,sizeof(lowcost));
memset(visited,0,sizeof(visited));
visited[0]=1;
pos=0;
for(i=0;i<n;i++)
if(i!=pos)
lowcost[i]=map[pos][i];
for(i=0;i<n-1;i++)
{
min=maxint;
for(j=0;j<n;j++)
if(visited[j]==0&&lowcost[j]<min)
{
min=lowcost[j];
pos=j;
}
visited[pos]=1;
sumweight+=min;
for(j=0;j<n;j++)
if(visited[j]==0&&map[pos][j]<lowcost[j])
lowcost[j]=map[pos][j];
}
return sumweight;
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
memset(map,maxint,sizeof(map));
for(i=0;i<n;i++)
scanf("%s",codes[i]);
init();///注意init()函数的调用在输入数据之后
int ans=prim();
printf("The highest possible quality is 1/%d.n",ans);
}
return 0;
}
最后
以上就是舒心往事为你收集整理的Prim()算法例题的全部内容,希望文章能够帮你解决Prim()算法例题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复