#include <iostream>
using namespace std;
#define MAXN 100
#define INF 100000
int cost[ MAXN ][ MAXN ];
int lowcost[ MAXN ];
int M, N, A, B, C;
void init()
{
for(int i = 0; i < M; i ++)
{
for(int j = 0; j < M; j ++)
{
cost[ i ][ j ] = INF;
if(i == j)
{
cost[ i ][ j ] = 0;
}
}
}
}
int prim(int v0)
{
int mindis, minone;
int ans = 0;
for(int i = 0; i < M; i ++)
{
lowcost[ i ] = cost[ i ][ v0 ];
}
for(int i = 0; i < M - 1; i ++)
{
mindis = INF;
for(int j = 0; j < M; j ++)
{
if(lowcost[ j ] < mindis && lowcost[ j ] != 0)
{
mindis = lowcost[ j ];
minone = j;
}
}
if(mindis == INF)
{
break;
}
ans += mindis;
lowcost[ minone ] = 0;
for(int j = 0; j < M; j ++)
{
if(lowcost[ j ] > cost[ j ][ minone ])
{
lowcost[ j ] = cost[ j ][ minone ];
}
}
}
if(mindis == INF)
{
return -1;
}
else
{
return ans;
}
}
int main()
{
while(scanf("%d %d", &N, &M))
{
if(N == 0)
{
break;
}
init();
while(N > 0)
{
scanf("%d %d %d", &A, &B, &C);
cost[ A - 1 ][ B - 1 ] = C;
cost[ B - 1 ][ A - 1 ] = C;
N --;
}
int t = prim( 0 );
if(t == -1)
{
printf("?\n");
}
else
{
printf("%d\n", t);
}
}
return 0;
}
杭电ACM1863(最小生成树)
最新推荐文章于 2019-06-08 16:50:17 发布