ロサンゼルス最大の食物連鎖の問題にバレーP4017ソリューションを数えます

P4017最大の食物連鎖数

トピックの背景

あなたは食物連鎖にそれを知っていますか?デリア生物学的試験、彼女は常にいくつかまたはいくつかは、いくつかの欠落を繰り返しているため、すべての間違った食物連鎖をカウントの対象。そこで彼女が来て、あなたを助けるが、あなたはああではないでしょう!彼女を助けるためにプログラムを書きます。

タイトル説明

あなたの食物網を与え、あなたは食物網における最大の食物連鎖の数を尋ねました。

(を参照ここで、「最大の食物連鎖」、生物学的な意味での食物連鎖、つまり、一番左の生産者は、ほとんどの消費者は権利ではありません他の種を捕食ではありませんが、他の生物による捕食です。)

デリアは非常に急務となっているので、あなただけの1秒を持っています。

この結果は大きすぎる可能性がありますので、あなただけの80112002金型の総出力を必要とします。

入力形式

最初の行、2つの正の整数N、M、及びN食べ食品関係の数mの種を表します。

2つの正の整数の次のm行は、Aは、食べ及びB.生物を食べる表します

出力フォーマット

整数、食物連鎖の結果、80112002型の最大数に並びます。

サンプル入力と出力

入力#1

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

出力#1

5

説明/ヒント

各テストポイントは、次の規則を満たします:

[補足]

中央データは、要件の生物学を満たすためには表示されません。(おかげで@AKEE)

[思考]

メモリ検索
私はその後、DPたい最初は失敗した
が、一見のメモリ検索よく考えて
、私はハを試していないので、
全く問題

[Tucao]

(そして、食物連鎖のコードとほぼ同じ)
(別のタイトル曲よりも黄色の食物連鎖)
80112002の弾性率が
、私はそれが人々の誕生日の質問は20021108轟音あると思い
興味深いです

[タイトル]効果

チェーンの完全な数を見つけるために有向グラフ
(そのまま鎖を意味する:
頭部が側鎖を持つことができない、チェーンが尾側を持つことはできません)

[解析]タイトル

私たちは、すでに述べている
完全なチェーンは、最初のチェーンはサイド持たないで
尾がエッジを持つことができない
がある場合、それはまた、食べたり食べることができるされているので
、これは食物連鎖の終わりではないこと
と見なすことはできません食物連鎖
(バイオ食物連鎖は、知識の一部が知っておくべきことを学びました)
ので、検索対象がある
最初から検索、エッジを満たすために何頭がないので
浸透度と時間の建設のレコードフィギュアように
、その後、点の場合浸透なし
で見つけることができます
が、条件依然として存在している
彼は学位を持っている必要があることを検索するために
、それ以外の場合には浸透していないうち度なしポイントはなりません
孤独な生き物が
何の浸透を満たしていない必要があり、度があり
、これがまた来ると考え孤立生物回避
この検索は残業に確かに
我々は、最適化を考慮しなければならないので、は、

[最適化]

剪定?非現実的
ではない片側行くための食物連鎖の構築に参加する可能性がある
ので、何の条件があれば剪定剪定
それのメモリを検索しないだろうことは
、特定があるとにかく、各ポイントの後にどのように多くの食物連鎖のは、
レコードの配列を開きます各ポイントの後、どのくらいの食物連鎖
値の配列がある場合になるように
、直接、十分なを追加し
そうについて発見され、その後、それらを記録

[完了コード】

#include<iostream>
#include<cstdio>
#define int long long
#define mo 80112002
using namespace std;
const int Max = 200010;
struct node
{
    int y,ne;
}a[Max << 2];
int head[Max >> 1],sum = 0;
void add(int x,int y)
{
    a[++ sum].y = y;
    a[sum].ne = head[x];
    head[x] = sum;
}
int ru[Max >> 2],chu[Max >> 2];
int dp[Max >> 2];
int ans = 0;

int dfs(int x)
{
    if(dp[x] != 0)return dp[x];
    int ans = 0;
    if(ru[x] != 0 && chu[x] == 0)
        ans ++;
    for(register int i = head[x];i != 0;i = a[i].ne)
    {
        ans += dfs(a[i].y);
    }
    dp[x] = ans % mo;
    return ans % mo;
}

signed main()
{
    freopen("food.in","r",stdin);
    int n,m;
    cin >> n >> m;
    int a,b;
    for(register int i = 1;i <= m;++ i)
    {
        cin >> a >> b;
        add(a,b);
        chu[a] ++;
        ru[b] ++;
    }
    int tot = 0;
    for(register int i = 1;i <= n;++ i)
        if(ru[i] == 0 && chu[i] != 0)
            tot += dfs(i) % mo;
    cout << tot % mo << endl;
    return 0; 
}

おすすめ

転載: www.cnblogs.com/acioi/p/11712361.html