题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863
prim:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 0x3fffffff
int graph[101][101];
int visit[101];
int flag[101];
int sum;
int n,m;
void prim()
{
sum=0;
int pox,i,mix;
visit[1]=1;
for(i=1;i<=m;++i)
flag[i] = graph[1][i];
int p = m-1;
while(p--)
{
mix=INF;
for(i=1;i<=m;++i)
{
if(mix>flag[i] && !visit[i])
{
mix = flag[i];
pox = i;
}
}
// printf("pox = %d\n",pox);
if(mix == INF)
{
printf("?\n");
return;
}
sum += mix;
visit[pox] = 1;
for(i=1;i<=m;++i)
{
if(flag[i]>graph[pox][i] && !visit[i])
{
flag[i] = graph[pox][i];
}
}
}
printf("%d\n",sum);
}
int main()
{
int i,j;
while(~scanf("%d%d",&n,&m))
{
if(n==0)
break;
memset(visit,0,sizeof(visit));
memset(flag,0,sizeof(flag));
for(i=1; i<=m; ++i)
{
for(j=1;j<=m;++j)
{
if(i==j)
graph[i][j] = 0;
else
graph[i][j] = INF;
}
}
int a,b,c;
for(i=1; i<=n; ++i)
{
scanf("%d%d%d",&a,&b,&c);
graph[a][b] = c;
graph[b][a] = c;
}
prim();
}
return 0;
}
kruskal:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,sum,cnt;
struct edge
{
int a;
int b;
int w;
}M[5000];
int father[110];
int cmp(edge a, edge b)
{
return a.w < b.w;
}
void init()
{
int i;
for(i=1;i<=m;++i)
{
father[i] = i;
}
}
int findFather(int x)
{
return father[x]==x?x:findFather(father[x]);
}
void kruskal()
{
int i;
int x;
int y;
for(i=1;i<=n;i++)
{
x = findFather(M[i].a);
y = findFather(M[i].b);
if(x!=y)
{
father[M[i].a] = father[M[i].b];
++cnt;
sum+= M[i].w;
}
if(cnt==m)
{
printf("%d\n",sum);
return ;
}
}
printf("?\n");
}
int main()
{
int i;
while(~scanf("%d%d",&n,&m))
{
if(n==0)
break;
cnt=1;
sum=0;
for(i=1;i<=n;++i)
{
scanf("%d%d%d",&M[i].a,&M[i].b,&M[i].w);
}
init();
sort(M+1,M+1+n,cmp);
kruskal();
}
return 0;
}