hdoj 1233 还是畅通工程---最小生成树---prime算法

时间:2023-03-08 19:09:51
hdoj 1233 还是畅通工程---最小生成树---prime算法

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1233

可以用Kruskal来做,不过当图的边比较稠密的时候用prime会更快一些。

AC代码:296MS

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int inf=0xffffff;
int dis[105],sum,n;
int weight[105][105];
void prime()
{
bool visit[105];
int pre[105];
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++)
{dis[i]=weight[1][i];pre[i]=1;}
visit[1]=1;
int index,mmin;
for(int i=1;i<=n-1;i++)
{
mmin=inf;
for(int j=1;j<=n;j++)
{
if(!visit[j] && dis[j]<mmin)
{
mmin=dis[j];
index=j;
}
}
visit[index]=1;
sum+=weight[pre[index]][index];
for(int i=1;i<=n;i++)
{
if(!visit[i] && weight[index][i]<dis[i])
{
dis[i]=weight[index][i];
pre[i]=index;
}
}
}
}
int main()
{ while(scanf("%d",&n))
{
if(n==0)break;
int m=n*(n-1)/2;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
weight[i][j]=inf;
for(int i=0;i<m;i++)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
weight[x][y]=z;
weight[y][x]=z;
}
sum=0;
prime();
cout<<sum<<endl;
}
}