P1038 神經網路 拓撲排序

2021-09-25 23:33:55 字數 1901 閱讀 9322

題目背景

人工神經網路(artificial neural networkartificialneuralnetwork)是一種新興的具有自我學習能力的計算系統,在模式識別、函式逼近及貸款風險評估等諸多領域有廣泛的應用。對神經網路的研究一直是當今的熱門方向,蘭蘭同學在自學了一本神經網路的入門書籍後,提出了乙個簡化模型,他希望你能幫助他用程式檢驗這個神經網路模型的實用性。

題目描述

在蘭蘭的模型中,神經網路就是一張有向圖,圖中的節點稱為神經元,而且兩個神經元之間至多有一條邊相連,下圖是乙個神經元的例子:

輸入輸出樣例

輸入 #1 複製

5 6

1 01 0

0 10 1

0 11 3 1

1 4 1

1 5 1

2 3 1

2 4 1

2 5 1

輸出 #1 複製

3 1

4 15 1

根據題意:

輸入層—>中間層---->輸出層

我們可以發現只要有出度的都不屬於輸出層。

也很明顯是乙個拓撲排序。

本題只有三層,我分別給前兩層標號1,2,

對於非輸入層的點根據題目中的公式要減掉u,

在輸入的時候我們就可以根據題意判斷出非輸入層的點,

然後讓它的c先減掉u,這樣我們後面計算c,只需要管求和部分

#include

using namespace std;

struct node

node

(int id,

int i)

:index

(id),in

(i) bool operator<

(const node&x)

const

} a[

105]

;struct edge};

vectorvec[

105]

;int

main()

while

(p--

) priority_queueq;

for(

int i =

1; i <= n; i++)}

while

(!q.

empty()

)//需要特判:對於乙個沒有出度的輸入層的點,它自身也是屬於輸出層

if(cnt) a[k.index]

.in =-1

;//有出度的去掉這個點,置為-1來標記

}for

(int i =

1; i <= n; i++)}

}int flag =0;

for(

int i =

1; i <= n; i++)}

if(!flag)

printf

("null\n");

return0;

}/*4 41 0

0 10 1

0 11 2 1

1 3 1

2 3 1

3 4 1

5 81 0

1 00 1

0 10 1

1 3 1

1 4 1

1 5 1

2 3 1

2 4 1

2 5 1

3 5 1

5 4 1

1 01 1

*/

P1038 神經網路 拓撲排序

傳送門 思路 一道拓撲排序經典題,此題要求算出最後所有的結點c i c i c i 一開始c i 0c i 0 c i 0的點被認為是輸入層,即入度為0的點。然後用拓撲排序對相鄰結點不斷操作即可,輸出層即出度為0的點。最後從1 11到n nn遍歷判斷該結點是否滿足 ou t i c i 0 out ...

P1038 神經網路 拓撲

人工神經網路 artificial neural network 是一種新興的具有自我學習能力的計算系統,在模式識別 函式逼近及貸款風險評估等諸多領域有廣泛的應用。對神經網路的研究一直是當今的熱門方向,蘭蘭同學在自學了一本神經網路的入門書籍後,提出了乙個簡化模型,他希望你能幫助他用程式檢驗這個神經網...

洛谷 P1038 神經網路(拓撲排序)

題目鏈結 題目意思比較明確,就是簡單的拓撲排序,這裡寫幾個圖操作需要注意的坑點。這裡的邊權值可能為正 負數,還可能為0,所以判斷兩個點之間是否有路徑時要注意。include using namespace std int ui 110 ci 110 wi 110 110 n,p,inedge 110...