您的位置:首页 > 其它

1001-专题四

2016-06-20 21:49 363 查看
1.题意:给出村子间的距离,以及已连接的村子,求村子联通需要修的最短路程

2.思路:路程相当于权数,离散数学的思想,我们上课讲的,prim,kruskal算法都可,思路不同,结论相同

3.感想:在这学期的数据结构中也有涉及。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int gp[105][105];
int lowercost[105];
int used[105];
int n;

int prim()
{
int i,j,k;
int sum=0;
used[1]=1;
for(i=1;i<=n;i++)
lowercost[i]=gp[1][i];
for(i=2;i<=n;i++)
{
int pos;
int temp=9999999;
for(j=1;j<=n;j++)
{
if(lowercost[j]<temp&&!used[j])
{
temp=lowercost[j];
pos=j;
}
}
used[pos]=1;
sum+=lowercost[pos];
for(k=1;k<=n;k++)
{
if(gp[pos][k]<lowercost[k]&&!used[k])
lowercost[k]=gp[pos][k];
}
}
return sum;
}

int main()
{
int i,j,m,a,b;
while(scanf("%d",&n)!=EOF)
{
memset(lowercost,0,sizeof(lowercost));
memset(used,0,sizeof(used));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&gp[i][j]);
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&a,&b);
gp[a][b]=gp[b][a]=0;
}
int ans=prim();
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: