HDU1233还是通常工程

某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 

Input

测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 
当N为0时,输入结束,该用例不被处理。 

Output

对每个测试用例,在1行里输出最小的公路总长度。 

Sample Input

3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0

Sample Output

3
5


        
  
Huge input, scanf is recommended.

Hint

Hint
        

prim

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<vector>
#define ll long long
#define inf 0x3f3f3f
//const int maxn=50005;
using namespace std;
int map[105][105];
int dist[105];
int vist[105];
int n;
void prim()
{
	//cout<<11111<<endl;
	int sum=0;
	memset(dist,inf,sizeof(dist));
	memset(vist,0,sizeof(vist));
	for(int i=1;i<=n;i++)
	 dist[i]=map[1][i];
	 dist[1]=0;
	// vist[1]=1;
	 for(int i=1;i<=n;i++)
	 {
	 	int v=-1,minn=inf;
	 	for(int j=1;j<=n;j++)
	 	{
	 		if(dist[j]<minn&&vist[j]==0)
	 		{
	 			minn=dist[j];
	 			v=j;
	 		}
	 	}
	 //	cout<<v<<endl;
	 	if(v==-1)break;
	 	vist[v]=1;
	 	sum+=dist[v];
	 	//cout<<sum<<endl;
	 	for(int k=1;k<=n;k++)
	 	{
	 		if(dist[k]>map[v][k]&&vist[k]==0)
	 		{
	 			dist[k]=map[v][k];
	 		}
	 	}
	 }
	 cout<<sum<<endl;
}
int main()
{
  		//int n;
  		while(cin>>n)
  		{
  			if(n==0)break;
  		for(int i=1;i<=n;i++)
  		{
  			for(int j=1;j<=n;j++)
  			{
  				map[i][j]=inf;
  			}
  			map[i][i]=0;
  		}
  		int x,y,z;
  	//	cout<<n*(n-1)/2<<endl;
  		for(int i=0;i<n*(n-1)/2;i++)
  		{
  			cin>>x>>y>>z;
  			if(map[x][y]>z)
  			map[x][y]=map[y][x]=z;
  			//cout<<map[x][y]<<endl;
  		}
  		prim();
  		}

	return 0;
}

kruscal

#include<stdio.h>
#include<iostream>
#include <string.h>
#include<algorithm>
using namespace std;
int flag[50000];
struct node
{
    int a;
    int b;
    int c;
} s1[10000];
int cmp( node x, node y)
{
    if (x.c!=y.c)
        
        return x.c<y.c;
    return 0;
}
int find(int x)
{
    if (flag[x]==x)
    {
        return x;
    }
    return flag[x]=find(flag[x]);
}
int un(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x!=y)

    flag[x]=y;
    return 0;
}
int main()
{
    int m,n,num;
    while (scanf("%d",&n)&&n>0)
    {
        num=0;
        m=(n*(n-1))/2;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&s1[i].a,&s1[i].b,&s1[i].c);
        }
        sort(s1, s1+m, cmp);
        for (int i=0; i<=n; i++)
        {
            flag[i]=i;
        }
        for (int i=0; i<m; i++)
        {
            if( find(s1[i].a) != find(s1[i].b))
               {
                   un(s1[i].a,s1[i].b);
                   num+=s1[i].c;
               }
        }
        
        cout<<num<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41453511/article/details/81166088
今日推荐