1. 程式人生 > >NYOJ 170-網路的可靠性

NYOJ 170-網路的可靠性

網路的可靠性

時間限制:3000 ms  |  記憶體限制:65535 KB難度:3

描述

A公司是全球依靠的網際網路解決方案提供商,也是2010年世博會的高階贊助商。它將提供先進的網路協作技術,展示其”智慧+互聯“的生活概念,同時為參觀者提供高品質的個人體驗和互動,以”資訊通訊,盡情城市夢想”為主題貫穿。藉助奇幻的劇場大螢幕和特效,展現資訊通訊技術的應用前景,通過生動形象的故事,向觀眾展示溝通無限制的未來社會前景。

為此,A公司為世博園的N個區域建立了視訊通訊系統,其中每個區域建立一個基站,編號依次為1,2,3...,N。通過基站之間的通訊線路為各區域的參觀者提供視訊服務。

已知在各基站之間已鋪設了一些光纖通訊線路,這些線路覆蓋了所有的區域,即任意兩個區域都可以進行視訊傳遞。但為了節約成本開支,目前只鋪設了N-1條線路,同時為了減輕各基站的資訊傳遞負載,每個基站最多有三條光纖通訊線路與之連線。

但在通訊系統試執行期間,A公司發現當某個基站發生故障時,會導致其它區域之間無法進行資訊傳遞。為了提高該通訊網路的可靠性,A公司準備在基站之間再新鋪設一些光纖線路,使得任意一個基站故障後,其它基站之間仍然可以通訊。

由於鋪設線路的成本昂貴,A公司希望新增設的光纖線路越少越好。A公司請求Dr. Kong來完成這個任務

輸入
有多組測試資料,以EOF為結束標誌。
第一行: N 表示有N個基站
接下來有N-1行:X Y 表示第X個基站與第Y個基站直連
1<=N<=10000
輸出
輸出一個整數,表示至少需新鋪設的光纖線路數
樣例輸入
8
1 3
3 2
5 3
5 4 
5 6
2 7
2 8
樣例輸出
3

分析:

本題我一定要好好分析給和我一樣轉不過彎的寶寶們,大佬們寫的本題都很簡單,也沒有具體的分析,三言兩語就過去了,可能相對於別人很簡單吧,然而我就是轉不過彎。

本題讀題感覺有種強連通的感覺,因為沒有學習過,所以不是太瞭解,而且也怪自己想的太麻煩了。

本題抽象的說已經有 n-1 條線連線了 n 個點,而且每個點最多直接與三個點相連,然後問你,如果有一個點壞掉了,其他點照樣能夠直接或間接的連通,這樣一來,我們就要考慮度為 1 的點了,你想啊,度不為 1 的點肯定不止與一個點相連,假設與 a 相連的點有 b 和 c ,如果 b 點壞掉了,是不是 a 還可以從 c 點走呢,這樣說的太抽象了,我們來看圖吧,假設我們拿題中的資料來模擬:

 

我們能看出圖中用紅筆圈出來的是度為 1 的點,這些度為 1 的點其實是很危險的,假設拿 8 來說,只要 2 壞掉了,那麼它就不能連通了,所以對於這些度為 1 的點,我們可以統計一下,讓他們兩兩相連是最省光纖的,這樣一來,他們也能有退路,因為與之相連的多了一個點,即使壞掉一個與之相連點也能連通,所以如果對於度為 1 的點正好是偶數的話,那麼就讓 sum/2,但如果是奇數的話,因為多出了一個點,它也需要連通,所以我們可以可以任意找個點與它相連,所以哇就是 sum/2+1,嗯,就醬紫的,沒有整明白的同學可以自己下去再模擬一下,關鍵能真正理解題中的意思,明白想考察的東西,要不然你會整的很麻煩不說,思路就是錯的。

#include <iostream>
#include<stdio.h>
#include<math.h>
#include<string>
#include<string.h>
using namespace std;

int a[10005];

int main()
{
    int n,c,d;
    int sum;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));
        sum=0;
        for(int i=1;i<n;i++)
        {
            scanf("%d %d",&c,&d);
            a[c]++;
            a[d]++;
        }
        for(int i=1;i<=n;i++)
        {
            if(a[i]==1)
                sum++;
        }
        if(sum%2==0)
            printf("%d\n",sum/2);
        else
            printf("%d\n",sum/2+1);
    }
    return 0;
}