/*
made by karen
12:00 at Mar.4,2012
prim算法求最小生成树
奇怪的是Dev c++可以编译
但是在Code Blocks里面编译不成功??
*/
#include <iostream>
#include <cstdio>
using namespace std;
#define INF 9999999
#define MAX_Point 110
#define MAX_Edge 12100
int arr_list[110][110];
struct Edge
{
int pointer;
int lowcost;
int flag;
}edge[MAX_Edge];
int prim(int n)
{
int i,j,k=1,flag,min,sum2=0;
j=1;
for(i=1;i<=n;i++)
{
if(i!=j)
{
edge[i].pointer=i;
edge[i].lowcost=arr_list[j][i];
edge[i].flag=0;
}
}
edge[j].lowcost=0;
edge[j].flag=1;
for(i=2;i<=n;i++)
{
k=1;
min=INF;
flag=0;
for(j=2;j<=n;j++)
{
if(edge[j].flag==0&&edge[j].lowcost<min)
{
k=j;
min=edge[j].lowcost;
flag=1;
}
}
if(!flag) return -1;
sum2+=min;
edge[k].flag=1;
for(j=2;j<=n;j++)
{
if(edge[j].flag==0&&arr_list[k][j]<edge[j].lowcost)
{
edge[j].pointer=k;
edge[j].lowcost=arr_list[k][j];
}
}
}
return sum2;
}
int main()
{
int n,m,a,b,c,i,j,sum;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0) break;
for(i=0;i<110;i++)
for(j=i+1;j<110;j++)
arr_list[i][j]=arr_list[j][i]=INF;
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c<arr_list[a][b])
arr_list[a][b]=arr_list[b][a]=c;
}
sum=prim(m);
if(sum==-1)
printf("?\n");
else
printf("%d\n",sum);
}
return 0;
}
hdu1863(prim算法)
最新推荐文章于 2021-07-28 09:58:37 发布