Luogu P1041感染症対策

オリジナルタイトル

トピックの背景

最近、新しい流行は世界中に荒れ狂います。蓬莱の国でも散発的な感染を発見し、病気は、政府が感染症の広がりを制御するためにすべてのコストで決めないようにするために、蓬莱の国の広い範囲で流行しています。人々はまだ流行を十分に認識していないので、残念ながら、正確にウイルスのキャリアを決定することは困難であり、ワクチンは弱者を保護するために開発されていません。だから、疾病管理蓬莱アメリカセンターは、病気の蔓延を制御する伝送方式を遮断することを決めました。WHO(世界保健機関)の努力だけでなく、科学研究部門の世界各国を通じ、この新興感染症の研究の送信および制御方法は、残りのタスクは、効果的な対策を開発するために疾病管理蓬莱国センターであなたを支援することです、明らかにされています。

タイトル説明

研究は、流行の広がりは2つの非常に特別な性質を持っていることが示されています。

最初の送信のその手段は木、男X-であるX-は、特定の人物Yされている可能性がYの感染症、Y限りY病気、またはXYない* * X ** Yとの間の伝達が遮断されます、そしてX- X-は病気ではないでしょう。

第二は、疾患の広がりは、疾患の広がりの期間内に、周期的である、感染症を有する患者は、世代に感染なり、そして次の世代に広がらないであろう。

これらの特性が大幅に国蓬莱病の予防とコントロールへの圧力を軽減し、彼らは潜在的な伝送方式図(木)影響を受けやすい人口の国内の一部を持っています。しかし、トラブルはまだ終わっていません。国蓬莱CDCのスタッフの不足だけでなく、強力な技術の不足なので、彼らは病気の伝染のサイクルであることを、送信のみのルートを遮断するために管理、および送信が制御されていないとして、それはより多くの影響を受けやすい集団がある原因になります感染(現在の人々はすでに連結送信に感染している、との接続がアプローチ切断されると、ある群衆ではありません)。あなたは健康な人が感染していることはできません場合は、病気の広がりを中止します。だから、国蓬莱CDCは、少数の人々が感染しているようにすることを、オーダーの送信カットオフをうまくします。

与えられた木、右のカット順序を見つけるためにあなたのプログラム。

入力形式

最初の行は二つの整数であり、NP
のP行は、各行が22の整数有するI及びjは、ノード表すI及びjは相互接続された側を有します。(どの手段、I及び第jは、人間との間に接続された透過率を有します)。患者が感染しているところノード1があります。

出力フォーマット

、人々の総数は、1行目に感染しました。

サンプル入力と出力

エントリー

7 6
1 2
1 3
2 4
2 5
3 6
3 7

輸出

3

説明/ヒント

1 ,.データの100%に\(\のLeq \) N- (\ \のLeq \) 300。

問題の解決策

(非常に(問題の解決時に自宅で退屈とその耐性を高めるために、ウイルス関連の話題を書くのか?))

まず貪欲検討し、切除されたノードの最大サイズの時間値を選択しますが、子供がいた場合には問題がある貪欲、である、チェーンの木は、彼らの最高の状態ですることはできません

あなたは、元のタイトルを見に行けば第二に、あなたはこの質問には、アルゴリズムは、我々は唯一の検索を考慮することができるので、(Pクラスは問題ではありません)解決するための複雑さの標準を見つけることができません多項式時間であることが証明されたでしょう。(Nは、<= 300はあなたの検索を与えることです)

ランダム化は、前に行うことができる必要がありますが、ここで私はA説明したがもっと賢明検索暴力、興味dalaoは、ランダム何を試すことができます

この木の大きさ、faとDFS1とDEPのうち最初の契約

LY内部を追加するために深インデックスノードが続きます

最後にDFS2検索暴力、注意を払う経験の深さまで>最大深さまたは層全体の状況がすぐに遮断されている値と戻りANSを更新します

ACコード:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1926;
vector<int> gpe[maxn],ly[maxn];
int dep[maxn],size[maxn],fa[maxn],n,p;
int maxdep=-1,ans=0;
void dfs1(int u,int f,int d){
    size[u]=1;
    dep[u]=d;
    fa[u]=f;
    for(int i=0;i<gpe[u].size();i++){
        int v=gpe[u][i];
        if(v==f) continue;
        dfs1(v,u,d+1);
        size[u]+=size[v];
    }
}
int vis[maxn];
void dfs2(int d,int now){
    if(d>maxdep){
        ans=min(ans,now);
        return;
    }
    for(int i=0;i<ly[d].size();i++){
        if(vis[fa[ly[d][i]]]){
            vis[ly[d][i]]=1;
        }else{
            vis[ly[d][i]]=0;
        }
    }
    int flag=1;
    for(int i=0;i<ly[d].size();i++){
        if(!vis[ly[d][i]]) flag=0;
    }
    if(flag){
        ans=min(ans,now);
        return;
    }
    for(int i=0;i<ly[d].size();i++){
        if(vis[ly[d][i]]) continue;
        vis[ly[d][i]]=1;
        dfs2(d+1,now-size[ly[d][i]]);
        vis[ly[d][i]]=0;
    }
}
int main(void){
    scanf("%d %d",&n,&p);
    for(int i=1;i<=p;i++){
        int u,v;
        scanf("%d %d",&u,&v);
        gpe[v].push_back(u);
        gpe[u].push_back(v);
    }
    dfs1(1,1,0);
    for(int i=1;i<n;i++){
        ly[dep[i]].push_back(i);
        maxdep=max(maxdep,dep[i]);
    }
    ans=n;
    dfs2(1,n);
    printf("%d",ans);
}

おすすめ

転載: www.cnblogs.com/jrdxy/p/12398610.html