程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> HDU 1232 暢通工程

HDU 1232 暢通工程

編輯:關於C語言

這個題目也是典型的最小生成樹算法的利用,不同於其他的題目就在於其它要求的是要添加的邊的最少數目,使得任意兩
點都有聯系,利用並查集算法 ,在題目已經給出的map基礎上,統計兩棵樹相並的次數,即使要添加的路徑的最少數目。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 int father[1001], tot;//father[i] 記錄 i 的 BOSS ! 
 5 //tot 統計最初至少需要添加的路徑數目 !
 6
 7 int find(int x)
 8 {//找 到  x 的 BOSS !
 9     int r = x;
10     while (r != father[r]) r = father[r];
11     return r;//
12 }
13
14 void join(int a, int b)
15 {//將 a 和  b 的 BOSS 統一!
16      int fa = find(a), fb = find(b);
17      if (fa != fb)
18      {
19         father[fa] = fb;
20         tot --; // 統一了一次兩個陣營的  BOSS ,所以需要添加的路徑的數目減一!
21      }
22 }
23
24 int main()
25 {
26     int n, m, x, y;
27     while (scanf("%d", &n), n)
28     {
29           scanf("%d", &m);
30           tot = n-1; // 初始化 tot 等於 n 個點聯通所需要的最少邊的數目 !
31           father[n+1];
32           for (int i=1; i<=n; i++)father[i] = i;//初始化自己是自己的 BOSS !
33          
34           for (int i=1; i<=m; i++)
35           {
36               scanf("%d %d",&x, &y);
37               join(x, y); 
38           }
39           printf("%d\n",tot); //輸出在已有基礎上還需要的邊的數目!
40     }
41     return 0;
42 }
43

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