程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 最短網絡Agri-Net,網絡Agri-Net

最短網絡Agri-Net,網絡Agri-Net

編輯:C++入門知識

最短網絡Agri-Net,網絡Agri-Net


問題描述】   農民約翰被選為他們鎮的鎮長!他其中一個競選承諾就是在鎮上建立起互聯網,並連接到所有的農場。當然,他需要你的幫助。約翰已經給他的農場安排了一條高速的網絡線路,他想把這條線路共享給其他農場。為了用最小的消費,他想鋪設最短的光纖去連接所有的農場。你將得到一份各農場之間連接費用的列表,你必須找出能連接所有農場並所用光纖最短的方案。每兩個農場間的距離不會超過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 }

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved