1. 程式人生 > 其它 >C++ shuffle函式,重排序給定範圍 [first, last) 中的元素(打亂順序)。

C++ shuffle函式,重排序給定範圍 [first, last) 中的元素(打亂順序)。

技術標籤:洛谷

P4017 最大食物鏈計數

題目背景

你知道食物鏈嗎?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 )

此題明顯為一個拓撲排序的題,見另一篇部落格結合程式碼學一下拓撲排序:https://blog.csdn.net/weixin_42643216/article/details/107778478?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160835840716780271198464%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=160835840716780271198464&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v29-13-107778478.first_rank_v2_pc_rank_v29&utm_term=%E6%8B%93%E6%89%91%E6%8E%92%E5%BA%8F

#include<bits/stdc++.h>
using namespace std;
int n,m,ru[5005],chu[5005],a,b,f[5005],ans;//
int mp[5005][5005];
queue<int> q;
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		scanf("%d%d", &a, &b);
		mp[a][b]=1;//記錄關係
		chu[a]++;
		ru[b]++;//記錄入度和出度
	}
	for(int i=1;i<=n;i++){
		if(ru[i]==0) {
			f[i]=1;
			q.push(i);//入度為零的入隊
		}
	}
	while(!q.empty()){//佇列不為空
		int a=q.front();
		q.pop();//出隊
		for(int k=1;k<=n;k++){
			if(mp[a][k]==0)continue;
			f[k]+=f[a];//更新
			f[k]%=80112002;
			ru[k]--;//食物少了一個
			if(ru[k]==0){//入隊為零才入隊
				if(chu[k]==0){
					ans+=f[k];
					ans%=80112002;
                    continue;//有沒有都行
				}
				q.push(k);
			}
		}
	}
	cout<<ans; 
}