通信网络

通信网络
现有一群设计师要在n(0<n<=100)个 城之间建立通信网络,每两个城市之间建设通信的线路费用和城市的数目是已知的,现在他要你帮他找出建设网络要花费的最小的费用,注意:网络必须连接到所有的城市
输入要求:输入的包括多组数据,每组测试数据的第一行是城市的个数N,,然后每一行包括三个数据分别是
两个城市和他们之间的距离,每组测试数据以三个0结束,
输出要求:
对于每组数据,输出建设通信网络的最小花费,每个测试实例占一行。
[样例输入]
6
1 2 6
1 3 1
1 4 5
2 3 5
2 5 6
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6
0 0 0
样例输出:
8
代码样例
  1 #include<stdio.h>
  2 #include<string.h>
  3 #include <algorithm>
  4 using namespace std;
  5 #define N 50
  6 int V;
  7 typedef struct Set
  8 {
  9     int data;
 10     int tag;
 11 }S;//tag是父节点
 12 typedef struct {
 13     int vs;//起始点
 14     int ve;
 15     int weight;
 16 }Edge;
 17 Edge e[N];
 18 int find(S set[],int i)
 19 {
 20     while(set[i].tag>=0)
 21         i=set[i].tag;
 22     return i;
 23 }
 24 void uniol(S set[],int i,int j)
 25 {
 26     int sum;
 27     i=find(set,i);
 28     j=find(set,j);
 29     if(i!=j)
 30     {
 31         sum=set[i].tag+set[j].tag;
 32         set[j].tag=i;
 33         set[i].tag=sum;
 34     }
 35 }
 36 int Kruskal(S set[],Edge e[],int n)
 37 {
 38     int i,t=0,r1,r2,sum=0;
 39     for(i=0;i<n;i++)
 40     {
 41         r1=find(set,e[i].vs);
 42         r2=find(set,e[i].ve);
 43         if(t==V-1)
 44             break;
 45         if(r1!=r2)
 46         {
 47             sum=sum+e[i].weight;
 48             uniol(set,r1,r2);
 49             t++;
 50         }
 51     }
 52     return sum;
 53 }
 54 
 55 void sort(Edge e[],int n)
 56 {
 57     int i,j;
 58     int t;
 59 
 60     for(i=0;i<n;i++)
 61         for(j=0;j<n-i-1;j++)
 62             if(e[j].weight>e[j+1].weight)
 63             {
 64                 t=e[j+1].weight;
 65                 e[j+1].weight=e[j].weight;
 66                 e[j].weight=t;
 67             }
 68 }
 69 
 70 int main()
 71 {
 72     //freopen("123.txt","r",stdin);
 73     int i,E,min_sum;
 74     int s,e,w;
 75     min_sum=0;E=0;//表示有多少条边
 76     S set[N];
 77     Edge ed[N];
 78     scanf("%d",&V);
 79     for(i=0;i<N;i++)
 80     {
 81         set[i].data=i;
 82         set[i].tag=-1;
 83     }
 84     while(scanf("%d%d%d",&s,&e,&w))
 85     {
 86         if(s==0&&e==0&&w==0)
 87             break;
 88         else{
 89             ed[E].vs=s;
 90             ed[E].ve=e;
 91             ed[E].weight=w;
 92             ++E;
 93         }
 94     }
 95     sort(ed,E);
 96     min_sum=Kruskal(set,ed,E);
 97     printf("%d\n",min_sum);
 98 
 99     return 0;
100 
101 
102 }
103 
104 
105 




你可能感兴趣的:(通信网络)