最短網路Agri-Net

自為風月馬前卒發表於2017-04-13
問題描述】
  農民約翰被選為他們鎮的鎮長!他其中一個競選承諾就是在鎮上建立起網際網路,並連線到所有的農場。當然,他需要你的幫助。約翰已經給他的農場安排了一條高速的網路線路,他想把這條線路共享給其他農場。為了用最小的消費,他想鋪設最短的光纖去連線所有的農場。你將得到一份各農場之間連線費用的列表,你必須找出能連線所有農場並所用光纖最短的方案。每兩個農場間的距離不會超過100000。
【輸入格式
第一行:
農場的個數,N3<=N<=100)。
第二行..
後來的行包含了一個N*N的矩陣,表示每個農場之間的距離。理論上,他們是N行,每行由N個用空格分隔的陣列成,實際上,他們限制在80個字元,因此,某些行會緊接著另一些行。當然,對角線將會是0,因為不會有線路從第i個農場到它本身。
【輸出格式】
    只有一個輸出,其中包含連線到每個農場的光纖的最小長度。
【輸入樣例】agrinet.in
    4
    0  4  9  21
    4  0  8  17
    9  8  0  16
    21 17 16  0
【輸出樣例】agrinet.out
  28
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int num=1;
 7 struct node
 8 {
 9     int u;
10     int v;
11     int w;
12     int next;
13 }edge[10001];
14 int head[10001];
15 int f[10001];
16 int tot=0;
17 int cmp(const node &a,const node &b)
18 {
19     if(a.w<b.w)return 1;
20     else return 0;
21 }
22 int find(int x)
23 {
24     if(f[x]!=x)
25     f[x]=find(f[x]);
26     return f[x];
27 }
28 void unionn(int x,int y)
29 {
30     int fx=find(x);
31     int fy=find(y);
32     if(fx!=fy)
33     f[fx]=fy;
34 }
35 int main()
36 {
37     int n;
38     scanf("%d",&n);
39     for(int i=0;i<=n;i++)head[i]=-1;
40     for(int i=0;i<=n;i++)f[i]=i;
41     for(int i=1;i<=n;i++)
42     {
43         for(int j=1;j<=n;j++)
44         {
45             int kk;
46             scanf("%d",&kk);
47             if(kk!=0)
48             {
49                 edge[num].w=kk;
50                 edge[num].u=i;
51                 edge[num].v=j;
52                 edge[num].next=head[i];
53                 num++;
54             }
55         }
56     }
57     int k=0;
58     sort(edge+1,edge+num,cmp);
59     for(int i=1;i<=num-1;i++)
60     {
61         if(find(edge[i].u)!=find(edge[i].v))
62         {
63             unionn(edge[i].u,edge[i].v);
64             tot=tot+edge[i].w;
65             k++;
66         }
67         if(k==n-1)break;
68     }
69     printf("%d",tot);
70     return 0;
71 }

 

 

相關文章