hdu1233(最小生成树)

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

 

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
 
初学最小生成树,不怎么会,完全是用Dijkstra算法改过来的  就当成是半个模板了0.0
 
 
 1 #include<iostream>

 2 #include<cstdio>

 3 #include<algorithm>

 4 #include<cstring>

 5 

 6 using namespace std;

 7 

 8 #define inf 99999999

 9 

10 int map[105][105],n,sum,node[105];

11 

12 void prim()

13 {

14     int vis[105]={0};

15     int tm=1,ans;

16     node[1]=0;

17     vis[1]=1;

18     for(int k=1;k<n;k++)

19     {

20         int Min=inf;

21         for(int i=1;i<=n;i++)

22         if(!vis[i])

23         {

24             if(node[i]>map[tm][i])

25             node[i]=map[tm][i];

26             //cout<<i<<node[i]<<" ";

27             if(Min>node[i])

28             {

29                 Min=node[i];

30                 ans=i;

31             }

32         }

33         vis[ans]=1,tm=ans;

34         sum+=Min;

35         //cout<<ans<<Min<<endl;

36         //cout<<Min<<" "<<ans<<" "<<sum<<endl;

37     }

38 }

39 

40 int main()

41 {

42     while(cin>>n&&n)

43     {

44         for(int i=1;i<=n;i++)

45         node[i]=inf;

46         for(int i=0;i<n*(n-1)/2;i++)

47         {

48             int a,b,x;

49             cin>>a>>b>>x;

50             map[a][b]=map[b][a]=x;

51         }

52         sum=0;

53         prim();

54         cout<<sum<<endl;

55     }

56     return 0;

57 }

 

你可能感兴趣的:(最小生成树)