1. 程式人生 > 其它 >vue元件彈框過渡動畫效果,如:點選顯示為從左到右滑動,收回隱藏為從右到左滑動

vue元件彈框過渡動畫效果,如:點選顯示為從左到右滑動,收回隱藏為從右到左滑動

技術標籤:動態規劃演算法拓撲排序動態規劃

題目背景

你知道食物鏈嗎?Delia 生物考試的時候,數食物鏈條數的題目全都錯了,因為她總是重複數了幾條或漏掉了幾條。於是她來就來求助你,然而你也不會啊!寫一個程式來幫幫她吧。

題目描述

給你一個食物網,你要求出這個食物網中最大食物鏈的數量。

(這裡的“最大食物鏈”,指的是生物學意義上的食物鏈,即最左端是不會捕食其他生物的生產者,最右端是不會被其他生物捕食的消費者。)

Delia 非常急,所以你只有11秒的時間。

由於這個結果可能過大,你只需要輸出總數模上8011200280112002的結果。

輸入格式

第一行,兩個正整數n、mn、m,表示生物種類nn和吃與被吃的關係數mm。

接下來mm行,每行兩個正整數,表示被吃的生物A和吃A的生物B。

輸出格式

一行一個整數,為最大食物鏈數量模上8011200280112002的結果。

輸入輸出樣例

輸入 #1複製

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

輸出 #1複製

5

說明/提示

各測試點滿足以下約定:

【補充說明】

資料中不會出現環,滿足生物學的要求。(感謝 @AKEE )

剛開始理解錯題意了2333

正解:求這個有向無環圖中有共有幾條食物鏈,每條食物鏈必須是 最弱者到最強者。

很明顯這跟拓撲排序有關。

操作:

1. 記錄每個點的出度跟入度。

2. 找到入度為0的一個點i,將與它相連的邊刪掉,相連的點j的入度-1。那麼有f[j]=f[j]+f[i],即從i到j的路線數。期間有入度為0的點進入佇列,當有點出度跟入度都為0,說明這條食物鏈結束了。

3.不斷重複2.

拓撲排序可以判斷有向圖是否有環,若經過上面的三步還有點剩餘,說明這個圖是有環的。

#include <bits/stdc++.h>
using namespace std;

const int mod=80112002;
int in[5005],out[5005],f[5005],a[5005][5005];
queue<int> q;
int main()
{
    int n,m,x,y,k,ans=0;
    cin>>n>>m;
    for(int i=1; i<=m; i++){
      cin>>x>>y;
      out[x]++;//出度
      in[y]++;//入度
      a[x][y]=1;
    }
    for(int i=1; i<=n; i++){//f[i]表示從食物鏈的起點到i有幾條路
        if(in[i]==0){//此時i為食物鏈起點
          f[i]=1;//i到i只有一條路線
          q.push(i);//入讀為0點入隊
        }
    }
    while(!q.empty()){
        x=q.front();
        q.pop();
        for(int i=1; i<=n; i++){
           if(a[x][i]){//找跟i相連結的點
              in[i]--;//入度減1
              a[x][i]=0;//刪掉邊
              f[i]=(f[x]+f[i])%mod;
              if(in[i]==0){
                  q.push(i);
              }
              if(in[i]==0&&out[i]==0){//已經到食物鏈的最高階
                 ans=(ans+f[i])%mod;
              }
           }
        }
    }
    cout<<ans<<endl;
    return 0;
}
//拓撲排序