3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
3 ?
#include <stdio.h>
#include <string.h>
#define inf 0x6fffff
int dis[105];
int map[105][105];
int vis[105];
int sum,n,ok,m;
void prim()
{
    int i,j,k,min;
    for(i=1;i<=n;i++)
        dis[i]=map[1][i];
    vis[1]=1;
    for(i=1;i<n;i++)  //循环到n-1就好
    {
        min=inf;
        for(j=1;j<=n;j++)
        {
            if(vis[j]==0 &&dis[j]<min)
            {
                min=dis[j];
                k=j;
            }
        }
        if(min==inf)  //如果此时有无穷大的边,说明有的路没有联通
		{
			ok=1;
			break;
		}
        vis[k]=1;
        sum+=min;
        for(j=1;j<=n;j++)
        {
            if(vis[j]==0 &&dis[j]>map[k][j])
                dis[j]=map[k][j];
        }
    }
}
int main()
{
    int i,j,a,l,b;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
		if(m==0)
			break;
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				map[i][j]=inf;
			for(i=1;i<=m;i++)
			{
				scanf("%d%d%d",&a,&b,&l);
				if(map[a][b]>l)
					map[a][b]=map[b][a]=l;
			}
			ok=0;
            memset(vis,0,sizeof(vis));
            sum=0;
            prim();
			if(!ok)
				printf("%d\n",sum);
			else
				printf("?\n");
    }
    return 0;
}
9 A 2 B 12 I 25 B 3 C 10 H 40 I 8 C 2 D 18 G 55 D 1 E 44 E 2 F 60 G 38 F 0 G 1 H 35 H 1 I 35 3 A 2 B 10 C 40 B 1 C 20 0
216 30
#include <stdio.h>
#include <string.h>
#define inf 0x6fffff
int dis[105];
int map[105][105];
int vis[105];
int sum,n;
void prim()
{
    int i,j,k,min;
    for(i=1;i<=n;i++)
        dis[i]=map[1][i];
    vis[1]=1;
    for(i=1;i<=n;i++)
    {
        min=inf;
        for(j=1;j<=n;j++)
        {
            if(vis[j]==0 &&dis[j]<min)
            {
                min=dis[j];
                k=j;
            }
        }
        if(min==inf)
            break;
        vis[k]=1;
        sum+=min;
        for(j=1;j<=n;j++)
        {
            if(vis[j]==0 &&dis[j]>map[k][j])
                dis[j]=map[k][j];
        }
    }
}
int main()
{
    int i,j,a,l;
    char b[22],b1[22];
    while(scanf("%d",&n)!=EOF&&n!=0)
    {
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                map[i][j]=inf;
            for(i=1;i<=n-1;i++)
            {
                scanf("%s",b);
                scanf("%d",&a);
                for(j=1;j<=a;j++)
                {
                    scanf("%s",b1);
                    scanf("%d",&l);
                    map[b[0]-'A'+1][b1[0]-'A'+1]=map[b1[0]-'A'+1][b[0]-'A'+1]=l; //我用-‘A‘+1输入,因为我的循环是从一开始的
                }
                getchar();
            }
            memset(vis,0,sizeof(vis));
            sum=0;
            prim();
            printf("%d\n",sum);
    }
    return 0;
}Description
Input
Output
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
#include <stdio.h>
#include <string.h>
#define inf 0x6fffff
int dis[105];
int map[105][105];
int vis[105];
int sum,n;
void prim()
{
	int i,j,k,min;
	for(i=1;i<=n;i++)
		dis[i]=map[1][i];
	vis[1]=1;
	for(i=1;i<=n;i++)
	{
		min=inf;
		for(j=1;j<=n;j++)
		{
			if(vis[j]==0 &&dis[j]<min)
			{
				min=dis[j];
				k=j;
			}
		}
		if(min==inf)
			break;
		vis[k]=1;
		sum+=min;
		for(j=1;j<=n;j++)
		{
			if(vis[j]==0 &&dis[j]>map[k][j])
				dis[j]=map[k][j];
		}
	}
}
int main()
{
	int i,j,a,b,l;
	   while(~scanf("%d",&n)&&n)
	   {
		   sum=0;
		   for(i=1;i<=n;i++)
			   for(j=1;j<=n;j++)
				   map[i][j]=inf;
			   for(i=1;i<=n;i++)
				   for(j=1;j<=n;j++)
				   {
					   scanf("%d",&l);
					   if(map[i][j]>l)
						   map[i][j]=map[j][i]=l;
				   }
				   memset(vis,0,sizeof(vis));
				   prim();
				   printf("%d\n",sum);
	   }
	   return 0;
}
各种最小生成树。 HDU 1863 HDU 1301 POJ 1258
原文:http://blog.csdn.net/sky_miange/article/details/43492841